#Использовать logos
#Использовать tempfiles
#Использовать v8runner
#Использовать fs
#Использовать "../lib/osparser"
#Использовать "plugins"

Перем Лог;
Перем КаталогИсходныхФайловРасширения;
Перем КаталогВременных Экспорт;
Перем ИмяКаталогаПлатформы Экспорт;
Перем КаталогИсходниковОбработки;
Перем ПроцессорXML;
Перем ПроцессорXMLБезУпрощения;
Перем МенеджерВременныхФайлов;
Перем ПрефиксПеременныхИПроцедур;
Перем ИмяГлавнойОбработки;
Перем ОписаниеРасширения;
Перем СоответствиеОбщихКартинок;
Перем СтруктураПортативныхИнструментов;
Перем КаталогШаблонаОбработки;
Перем КаталогШаблонаФормы;
Перем КаталогШаблонаМакетаДвоичныхДанных;
Перем МодулиБезДобавленияВИнтерфейс;
Перем ВариантСборки;
Перем ТекстыСтроковыхФункцияДляСовместимости;

#Область СобытияКласса

Процедура ПриСозданииОбъекта(Каталог)
	КаталогИсходныхФайловРасширения = Каталог;
	ПрефиксПеременныхИПроцедур = "УИ_ГЕНЕРАЦИЯ_";
	КаталогШаблонаОбработки = КаталогШаблонаОбработки();
	КаталогШаблонаФормы = КаталогШаблонаФормы();
	КаталогШаблонаМакетаДвоичныхДанных = КаталогШаблонаМакетаДвоичныхДанных();
	
	МодулиБезДобавленияВИнтерфейс = Новый Массив;
	МодулиБезДобавленияВИнтерфейс.Добавить("УИ_ТехПоддержка");
	МодулиБезДобавленияВИнтерфейс.Добавить("УИ_ПреобразованиеДанныхJSON");
	МодулиБезДобавленияВИнтерфейс.Добавить("УИ_МенеджерХранилищНастроек");
	МодулиБезДобавленияВИнтерфейс.Добавить("УИ_ПарсерВстроенногоЯзыка");
	МодулиБезДобавленияВИнтерфейс.Добавить("УИ_ПлагинПарсераВстроенногоЯзыка_ДоработкаТекстаАлгоритмаДляОбработки");
	МодулиБезДобавленияВИнтерфейс.Добавить("УИ_ПлагинПарсераВстроенногоЯзыка_ПереименованиеПеременных");
	МодулиБезДобавленияВИнтерфейс.Добавить("УИ_ПлагинПарсераВстроенногоЯзыка_ПолучениеСтруктурыМодуля");
	МодулиБезДобавленияВИнтерфейс.Добавить("УИ_ПлагинПарсераВстроенногоЯзыка_УстановкаДирективКомпиляцииУМетодовМодуля");
	МодулиБезДобавленияВИнтерфейс.Добавить("УИ_Алгоритмы2");
	
	ВариантСборки = ВариантыСборки.Портативный;
	
	ТекстыСтроковыхФункцияДляСовместимости = Новый Структура;
	
	ТекстФункцийСовместимости = ТекстМодуля(ОбъединитьПути(СтартовыйСценарий().Каталог, "Шаблоны", "ФункцииСовместимостиСоСтарымиПлатформами.os"));
	ТекстыСтроковыхФункцияДляСовместимости.Вставить("Модуль", ТекстФункцийСовместимости);
	ТекстыСтроковыхФункцияДляСовместимости.Вставить("МодульФормы", ДобавитьДирективуМетодовМодуля(ТекстФункцийСовместимости, "&НаКлиентеНаСервереБезКонтекста"));
	
КонецПроцедуры

#КонецОбласти

#Область ПрограммныйИнтерфейс

Процедура УстановитьЛог(НовыйЛог) Экспорт
	Лог = НовыйЛог;
КонецПроцедуры

Процедура ВыполнитьКонвертацию(КаталогПортативнойСборки) Экспорт
	МенеджерВременныхФайлов.БазовыйКаталог = КаталогВременных;
	
	СтруктураПортативныхИнструментов = НовыйСтруктураИнструментов();
	СтруктураПортативныхИнструментов.КаталогИсходников = МенеджерВременныхФайлов.СоздатьКаталог();
	СтруктураПортативныхИнструментов.КаталогИнструментов = МенеджерВременныхФайлов.СоздатьКаталог();
	СтруктураПортативныхИнструментов.КаталогОбщихМодулей = МенеджерВременныхФайлов.СоздатьКаталог();
	СтруктураПортативныхИнструментов.КаталогКартинок = МенеджерВременныхФайлов.СоздатьКаталог();
	
	ФС.ОбеспечитьКаталог(СтруктураПортативныхИнструментов.КаталогИнструментов);
	ФС.ОбеспечитьКаталог(СтруктураПортативныхИнструментов.КаталогОбщихМодулей);
	ФС.ОбеспечитьКаталог(СтруктураПортативныхИнструментов.КаталогКартинок);
	
	ПрочитатьОписаниеКонфигурации(ОбъединитьПути(КаталогИсходныхФайловРасширения, "Инструменты"));
	
	СтруктураПортативныхИнструментов.Версия = ОписаниеРасширения.Версия;
	СтруктураПортативныхИнструментов.Поставщик = ОписаниеРасширения.Поставщик;
	
	СкопироватьИсходныеФайлыДляКонвертации();
	
	Для Каждого ТекИнструмент Из СтруктураПортативныхИнструментов.Инструменты Цикл
		СконвертироватьОбработку(ТекИнструмент.Значение);
	КонецЦикла;
	
	Для Каждого ТекИнструмент Из СтруктураПортативныхИнструментов.ОбщиеМодули Цикл
		СконвертироватьОбщийМодуль(ТекИнструмент.Значение);
	КонецЦикла;
	
	
	СконвертироватьМодулиПортативнойПоставки();
	
	СобратьБинарныеФайлыМодулей(КаталогПортативнойСборки);
	
	СобратьГлавнуюОбработку(КаталогПортативнойСборки);
	
	СобратьБинарныйФайлГлавнойОбработки(КаталогПортативнойСборки);
КонецПроцедуры

#КонецОбласти

#Область ОбщиеМетоды

Функция КаталогШаблонаОбработки()
	Возврат ОбъединитьПути(СтартовыйСценарий().Каталог, "Шаблоны", "ПустаяОбработка");
КонецФункции

Функция КаталогШаблонаФормы()
	Возврат ОбъединитьПути(СтартовыйСценарий().Каталог, "Шаблоны", "ПустаяФорма");
КонецФункции

Функция КаталогШаблонаМакетаДвоичныхДанных()
	Возврат ОбъединитьПути(СтартовыйСценарий().Каталог, "Шаблоны", "МакетДвоичныхДанных");
КонецФункции

Функция НовыйСтруктураИнструментов()
	Структура = Новый Структура;
	Структура.Вставить("Инструменты", Новый Структура);
	Структура.Вставить("ОбщиеМодули", Новый Структура);
	Структура.Вставить("Картинки", Новый Структура);
	Структура.Вставить("ГлавнаяОбработка", Новый Структура);
	Структура.Вставить("КаталогИсходников", "");
	Структура.Вставить("КаталогИнструментов", "");
	Структура.Вставить("КаталогОбщихМодулей", "");
	Структура.Вставить("КаталогКартинок", "");
	Структура.Вставить("Версия", "");
	Структура.Вставить("Поставщик", "");
	
	Возврат Структура;
КонецФункции

Функция УзелЭлемента(ЭлементОписания)
	УзелОписания = Неопределено;
	
	// если таблица тогда
	Если ТипЗнч(ЭлементОписания) <> Тип("КлючИЗначение") Тогда
		Для Каждого КлючЗ Из ЭлементОписания Цикл
			УзелОписания = КлючЗ;
			Прервать;
		КонецЦикла;
	Иначе
		УзелОписания = ЭлементОписания;
	КонецЕсли;
	
	Возврат УзелОписания;
КонецФункции


Функция ТекстМодуля(ФайлМодуля)
	Текст = Новый ТекстовыйДокумент;
	Текст.Прочитать(ФайлМодуля, "UTF-8");
	
	Возврат Текст.ПолучитьТекст();
КонецФункции

Процедура ЗаписатьМодуль(ТекстМодуля, имяФайла)
	Текст = Новый ТекстовыйДокумент;
	Текст.УстановитьТекст(ТекстМодуля);
	
	Текст.Записать(Имяфайла, "UTF-8");
	
КонецПроцедуры

#КонецОбласти

#Область КопированиеИсходниковВоВременныйКаталог
Процедура СкопироватьМодульМенеджераВоВнешнююОбработку(ОписаниеМодуля)
	ОписаниеМодуля.Вставить("МодульМенеджера", Ложь);
	ИмяФайлаМодуляМенеджера = ОбъединитьПути(ОписаниеМодуля.Каталог, "Ext", "ManagerModule.bsl");
	Если НЕ ФС.ФайлСуществует(ИмяФайлаМодуляМенеджера) Тогда
		Возврат;
	КонецЕсли;
	
	Текст = ТекстМодуля(ИмяФайлаМодуляМенеджера);
	Если НЕ ЗначениеЗаполнено(СокрЛП(Текст)) Тогда
		Возврат;
	КонецЕсли;
	
	ОписаниеМодуля.Вставить("МодульМенеджера", Истина);
	
	ИмяМодуляМенеджера = ОписаниеМодуля.Имя + "_МодульМенеджера";
	ИмяИсходногоФайлаОбработки = ОбъединитьПути(СтруктураПортативныхИнструментов.КаталогОбщихМодулей, ИмяМодуляМенеджера + ".xml");
	
	КопироватьФайл(
	ОбъединитьПути(КаталогШаблонаОбработки, "ШаблонОбработки.xml"),
	ИмяИсходногоФайлаОбработки);
	
	ФС.КопироватьСодержимоеКаталога(
	ОбъединитьПути(КаталогШаблонаОбработки, "ШаблонОбработки"),
	ОбъединитьПути(СтруктураПортативныхИнструментов.КаталогОбщихМодулей, ИмяМодуляМенеджера));
	
	КопироватьФайл(
	ИмяФайлаМодуляМенеджера,
	ОбъединитьПути(СтруктураПортативныхИнструментов.КаталогОбщихМодулей, ИмяМодуляМенеджера, "Ext", "ObjectModule.bsl"));
	
	СтруктураОписания = СтрукутураОписанияИнструмента(ИмяИсходногоФайлаОбработки);
	СтруктураОписания.Вставить("Сервер", Истина);
	СтруктураОписания.Вставить("ВызовСервера", Ложь);
	СтруктураОписания.Вставить("Клиент", Ложь);
	СтруктураОписания.ЭтоМодульМенеджера = Истина;
	
	СтруктураПортативныхИнструментов.ОбщиеМодули.Вставить(ОписаниеМодуля.Имя, СтруктураОписания);
КонецПроцедуры

Процедура СкопироватьИнструментВКаталогИсходников(ОписаниеМодуля)
	ИмяФайлаОписанияИнструмента = ОбъединитьПути(СтруктураПортативныхИнструментов.КаталогИнструментов, ОписаниеМодуля.Имя + ".xml");
	
	КопироватьФайл(
	ОписаниеМодуля.ФайлОписания,
	ИмяФайлаОписанияИнструмента);
	
	ФС.КопироватьСодержимоеКаталога(
	ОписаниеМодуля.Каталог,
	ОбъединитьПути(СтруктураПортативныхИнструментов.КаталогИнструментов, ОписаниеМодуля.Имя));
	
	СтруктураПортативныхИнструментов.Инструменты.Вставить(ОписаниеМодуля.Имя, СтрукутураОписанияИнструмента(ИмяФайлаОписанияИнструмента));
	
	СкопироватьМодульМенеджераВоВнешнююОбработку(СтруктураПортативныхИнструментов.Инструменты[ОписаниеМодуля.Имя]);
КонецПроцедуры

Процедура СкопироватьОбщийМодульВоВнешнююОбработку(ОписаниеМодуля)
	ИмяФайлаОписанияИнструмента = ОбъединитьПути(СтруктураПортативныхИнструментов.КаталогОбщихМодулей, ОписаниеМодуля.Имя + ".xml");
	
	КопироватьФайл(
	ОбъединитьПути(КаталогШаблонаОбработки, "ШаблонОбработки.xml"),
	ИмяФайлаОписанияИнструмента);
	
	ФС.КопироватьСодержимоеКаталога(
	ОбъединитьПути(КаталогШаблонаОбработки, "ШаблонОбработки"),
	ОбъединитьПути(СтруктураПортативныхИнструментов.КаталогОбщихМодулей, ОписаниеМодуля.Имя));
	
	// Если ОписаниеМодуля.Сервер Тогда
	КопироватьФайл(
	ОбъединитьПути(ОписаниеМодуля.Каталог, "Ext", "Module.bsl"),
	ОбъединитьПути(СтруктураПортативныхИнструментов.КаталогОбщихМодулей, ОписаниеМодуля.Имя, "Ext", "ObjectModule.bsl"));
	// КонецЕсли;
	Если ОписаниеМодуля.Клиент
		ИЛИ ОписаниеМодуля.ВызовСервера Тогда
		
		КопироватьФайл(
		ОбъединитьПути(ОписаниеМодуля.Каталог, "Ext", "Module.bsl"),
		ОбъединитьПути(ОбъединитьПути(СтруктураПортативныхИнструментов.КаталогОбщихМодулей, ОписаниеМодуля.Имя, "Forms", "Форма"), "Ext", "Form", "Module.bsl"));
	КонецЕсли;
	
	СтруктураОписания = СтрукутураОписанияИнструмента(ИмяФайлаОписанияИнструмента);
	СтруктураОписания.Вставить("Сервер", ОписаниеМодуля.Сервер);
	СтруктураОписания.Вставить("ВызовСервера", ОписаниеМодуля.ВызовСервера);
	СтруктураОписания.Вставить("Клиент", ОписаниеМодуля.Клиент);
	
	СтруктураПортативныхИнструментов.ОбщиеМодули.Вставить(ОписаниеМодуля.Имя, СтруктураОписания);
	
КонецПроцедуры


Процедура СкопироватьИсходныеФайлыДляКонвертации()
	Для Каждого ТекМодуль Из ОписаниеРасширения.ОбщиеМодули Цикл
		СкопироватьОбщийМодульВоВнешнююОбработку(ТекМодуль);
	КонецЦикла;
	
	Для Каждого ТекОбработка Из ОписаниеРасширения.Обработки Цикл
		СкопироватьИнструментВКаталогИсходников(ТекОбработка);
	КонецЦикла;
	
	Для Каждого ТекОбработка Из ОписаниеРасширения.Отчеты Цикл
		СкопироватьИнструментВКаталогИсходников(ТекОбработка);
	КонецЦикла;
	
	Для Каждого ТекКартинка Из ОписаниеРасширения.ОбщиеКартинки Цикл
		КаталогПоискаФайла = ОбъединитьПути(ОбъединитьПути(КаталогИсходныхФайловРасширения, "Инструменты", "CommonPictures", ТекКартинка.Имя), "Ext", "Picture");
		
		НайденныеФайлы = НайтиФайлы(КаталогПоискаФайла, "*");
		
		Если НайденныеФайлы.Количество() = 0 Тогда
			Лог.Ошибка("Не удалось скопировать картинку " + ТекКартинка.Имя + " в " + КаталогПоискаФайла);
			Продолжить;
		КонецЕсли;
		
		ФайлКартинки = НайденныеФайлы[0];
		ИмяНовогоФайлаКартинки = ОбъединитьПути(СтруктураПортативныхИнструментов.КаталогКартинок,
		ТекКартинка.Имя + ФайлКартинки.Расширение);
		КопироватьФайл(ФайлКартинки.ПолноеИмя, ИмяНовогоФайлаКартинки);
		
		ОписаниеКартинки = Новый Структура;
		ОписаниеКартинки.Вставить("Имя", ТекКартинка.Имя);
		ОписаниеКартинки.Вставить("РасширениеКартинки", ФайлКартинки.Расширение);
		ОписаниеКартинки.Вставить("ИмяФайла", ИмяНовогоФайлаКартинки);
		
		СтруктураПортативныхИнструментов.Картинки.Вставить(ТекКартинка.Имя, ОписаниеКартинки);
	КонецЦикла;
	
	
	КаталогГлавнойОбработки = ОбъединитьПути(СтруктураПортативныхИнструментов.КаталогИсходников, "Портативный");
	
	КаталогИсходныхФайловГлавнойОбработки = ОбъединитьПути(КаталогИсходныхФайловРасширения, "Портативный", "ExternalDataProcessors");
	ФС.КопироватьСодержимоеКаталога(КаталогИсходныхФайловГлавнойОбработки, КаталогГлавнойОбработки);
	
	СтруктураПортативныхИнструментов.ГлавнаяОбработка = СтрукутураОписанияИнструмента(ОбъединитьПути(КаталогГлавнойОбработки, ИмяГлавнойОбработки + ".xml"));
	
КонецПроцедуры

#КонецОбласти

#Область ЧтениеИнформацииОбОбъектах

Функция ИмяУзлаОбработки(ЭтоОтчет, Внешняя = Ложь)
	Префикс = "";
	Если Внешняя Тогда
		Префикс = "External";
	КонецЕсли;
	
	Если ЭтоОтчет Тогда
		Возврат Префикс + "Report";
	Иначе
		Возврат Префикс + "DataProcessor";
	КонецЕсли;
КонецФункции

Функция НовыйОписаниеКонфигурации()
	Описание = Новый Структура;
	Описание.Вставить("Обработки", Новый Массив);
	Описание.Вставить("Отчеты", Новый Массив);
	Описание.Вставить("ОбщиеМодули", Новый Массив);
	Описание.Вставить("ОбщиеФормы", Новый Массив);
	Описание.Вставить("ОбщиеКартинки", Новый Массив);
	Описание.Вставить("ОбщиеШаблоны", Новый Массив);
	Описание.Вставить("МодульПриложения", "");
	Описание.Вставить("Версия", "");
	Описание.Вставить("Поставщик", "");
	
	Возврат Описание;
КонецФункции

Функция ПрочитатьМассивМетаданных(Каталог)
	Массив = Новый Массив;
	
	ФайлыОписаний = НайтиФайлы(Каталог, "*.xml", Ложь);
	Для Каждого ТекМетаданное Из ФайлыОписаний Цикл
		ОписаниеМетаданного = Новый Структура;
		ОписаниеМетаданного.Вставить("Имя", ТекМетаданное.ИмяБезРасширения);
		ОписаниеМетаданного.Вставить("ФайлОписания", ТекМетаданное.ПолноеИмя);
		ОписаниеМетаданного.Вставить("Каталог", ОбъединитьПути(Каталог, ТекМетаданное.ИмяБезРасширения));
		
		Массив.Добавить(ОписаниеМетаданного);
	КонецЦикла;
	
	Возврат Массив;
КонецФункции

Процедура ПрочитатьОписаниеКонфигурации(КаталогИсходниковИнструментов)
	ОписаниеРасширения = НовыйОписаниеКонфигурации();
	ОписаниеРасширения.Обработки = ПрочитатьМассивМетаданных(ОбъединитьПути(КаталогИсходниковИнструментов, "DataProcessors"));
	ОписаниеРасширения.Отчеты = ПрочитатьМассивМетаданных(ОбъединитьПути(КаталогИсходниковИнструментов, "Reports"));
	ОбщиеМодулиРасширения = ПрочитатьМассивМетаданных(ОбъединитьПути(КаталогИсходниковИнструментов, "CommonModules"));
	ОбщиеМодули = Новый Массив;
	
	Для Каждого ТекМодуль Из ОбщиеМодулиРасширения Цикл
		Если НЕ СтрНачинаетсяС(НРег(ТекМодуль.Имя), "уи_") Тогда
			Продолжить;
		КонецЕсли;
		
		ОбщиеМодули.Добавить(ТекМодуль);
	КонецЦикла;
	
	ОписаниеРасширения.ОбщиеМодули = ОбщиеМодули;
	
	ОписаниеРасширения.ОбщиеШаблоны = ПрочитатьМассивМетаданных(ОбъединитьПути(КаталогИсходниковИнструментов, "CommonTemplates"));
	ОписаниеРасширения.ОбщиеФормы = ПрочитатьМассивМетаданных(ОбъединитьПути(КаталогИсходниковИнструментов, "CommonForms"));
	ОписаниеРасширения.ОбщиеКартинки = ПрочитатьМассивМетаданных(ОбъединитьПути(КаталогИсходниковИнструментов, "CommonPictures"));
	ОписаниеРасширения.МодульПриложения = ОбъединитьПути(КаталогИсходниковИнструментов, "Ext", "ManagedApplicationModule.bsl");
	
	ОписаниеКонфигурацииXML = ПроцессорXML.ПрочитатьИзФайла(ОбъединитьПути(КаталогИсходниковИнструментов, "Configuration.xml"));
	УзелОписанияКонфигурации = ОписаниеКонфигурацииXML["MetaDataObject"]._Элементы["Configuration"]._Элементы["Properties"];
	
	ОписаниеРасширения.Версия = УзелОписанияКонфигурации["Version"];
	ОписаниеРасширения.Поставщик = УзелОписанияКонфигурации["Vendor"];
	
	СоответствиеОбщихКартинок = Новый Соответствие;
	Для Каждого ТекКартинка Из ОписаниеРасширения.ОбщиеКартинки Цикл
		СоответствиеОбщихКартинок.Вставить(ТекКартинка.Имя, ТекКартинка);
	КонецЦикла;
	
	Для Каждого ТекМодуль Из ОписаниеРасширения.ОбщиеМодули Цикл
		ОписаниеНастроекМодуля = ПроцессорXMLБезУпрощения.ПрочитатьИзФайла(ТекМодуль.ФайлОписания);
		УзелСвойствОбработки = ОписаниеНастроекМодуля._Элементы["MetaDataObject"]._Элементы["CommonModule"]._Элементы["Properties"];
		
		ТекМодуль.Вставить("Сервер", Булево(УзелСвойствОбработки._Элементы["Server"]._Значение));
		ТекМодуль.Вставить("ВызовСервера", Булево(УзелСвойствОбработки._Элементы["ServerCall"]._Значение));
		// ОписаниеМодуля.Вставить("Привелигированный",Булево(УзелСвойствОбработки._Элементы["Privileged"]._Значение));
		ТекМодуль.Вставить("Клиент", Булево(УзелСвойствОбработки._Элементы["ClientManagedApplication"]._Значение));
		
	КонецЦикла;
	
КонецПроцедуры

Функция ПодчиненныеОбъектыИнструментаПоВиду(ОписаниеXML, ИмяУзлаОбработки, Вид)
	УзелОбработки = ОписаниеXML._Элементы["MetaDataObject"]._Элементы[ИмяУзлаОбработки];
	
	ПодчиненныеОбъекты = Новый Массив;
	Для Каждого СоответствиеПодчиненнойФормы Из УзелОбработки._Элементы["ChildObjects"]._Элементы Цикл
		ИмяОбъекта = Неопределено;
		Если ТипЗнч(СоответствиеПодчиненнойФормы) = Тип("Соответствие") Тогда
			УзелИмени = СоответствиеПодчиненнойФормы[Вид];
			Если УзелИмени <> Неопределено Тогда
				ИмяОбъекта = УзелИмени._Значение;
			КонецЕсли;
		ИначеЕсли ТипЗнч(СоответствиеПодчиненнойФормы) = Тип("КлючИЗначение") Тогда
			Если СоответствиеПодчиненнойФормы.Ключ = Вид Тогда
				УзелИмени = СоответствиеПодчиненнойФормы.Значение;
				Если УзелИмени <> Неопределено Тогда
					ИмяОбъекта = УзелИмени._Значение;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		Если ИмяОбъекта = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		ПодчиненныеОбъекты.Добавить(ИмяОбъекта);
	КонецЦикла;
	
	Возврат ПодчиненныеОбъекты;
КонецФункции

Функция ПодчиненныеОбъектыРеквизитовИнструментаПоВиду(ОписаниеXML, ИмяУзлаОбработки, Вид)
	УзелОбработки = ОписаниеXML._Элементы["MetaDataObject"]._Элементы[ИмяУзлаОбработки];
	
	ПодчиненныеОбъекты = Новый Массив;
	Для Каждого СоответствиеПодчиненнойФормы Из УзелОбработки._Элементы["ChildObjects"]._Элементы Цикл
		
		УзелРеквизита = Неопределено;
		Если ТипЗнч(СоответствиеПодчиненнойФормы) = Тип("Соответствие") Тогда
			УзелИмени = СоответствиеПодчиненнойФормы[Вид];
			Если УзелИмени <> Неопределено Тогда
				УзелРеквизита = УзелИмени;
			КонецЕсли;
		ИначеЕсли ТипЗнч(СоответствиеПодчиненнойФормы) = Тип("КлючИЗначение") Тогда
			Если СоответствиеПодчиненнойФормы.Ключ = Вид Тогда
				УзелИмени = СоответствиеПодчиненнойФормы.Значение;
				Если УзелИмени <> Неопределено Тогда
					УзелРеквизита = УзелИмени;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		Если УзелРеквизита = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		ПодчиненныеОбъекты.Добавить(УзелРеквизита._Элементы["Properties"]._Элементы["Name"]._Значение);
	КонецЦикла;
	
	Возврат ПодчиненныеОбъекты;
КонецФункции

Функция СтрукутураОписанияИнструмента(ИмяФайлаОписанияИнструмента)
	Описание = Новый Структура;
	
	ФайлОписания = Новый Файл(ИмяФайлаОписанияИнструмента);
	Описание.Вставить("ФайлОписания", ИмяФайлаОписанияИнструмента);
	Описание.Вставить("Каталог", ОбъединитьПути(ФайлОписания.Путь, ФайлОписания.ИмяБезРасширения));
	Описание.Вставить("Имя", ФайлОписания.ИмяБезРасширения);
	Описание.Вставить("НеДляВыводаВИнтерфейс", МодулиБезДобавленияВИнтерфейс.Найти(Описание.Имя) <> Неопределено);
	
	ОписаниеXML = ПроцессорXMLБезУпрощения.ПрочитатьИзФайла(ИмяФайлаОписанияИнструмента);
	СтруктураВидаУзла = СтруктураУзлаВидаИмениИнструмента(ОписаниеXML);
	Описание.Вставить("Внешний", СтруктураВидаУзла.Внешний);
	Описание.Вставить("ЭтоОтчет", СтруктураВидаУзла.ЭтоОтчет);
	Описание.Вставить("ЭтоМодульМенеджера", Ложь);
	Описание.Вставить("УспешноСобран", Ложь);
	Описание.Вставить("ФайлРезультатаСборки", "");
	Описание.Вставить("ИмяУзла", ИмяУзлаОбработки(Описание.ЭтоОтчет, Описание.Внешний));
	
	Описание.Вставить("Синоним", СинонимОбработки(ОписаниеXML, Описание.ИмяУзла));
	Описание.Вставить("ОписаниеXML", ОписаниеXML);
	
	Описание.Вставить("Формы",
	ПодчиненныеОбъектыИнструментаПоВиду(ОписаниеXML, Описание.ИмяУзла, "Form"));
	Описание.Вставить("Макеты",
	ПодчиненныеОбъектыИнструментаПоВиду(ОписаниеXML, Описание.ИмяУзла, "Template"));
	Описание.Вставить("Реквизиты",
	ПодчиненныеОбъектыРеквизитовИнструментаПоВиду(ОписаниеXML, Описание.ИмяУзла, "Attribute"));
	Описание.Вставить("ТабличныеЧасти",
	ПодчиненныеОбъектыРеквизитовИнструментаПоВиду(ОписаниеXML, Описание.ИмяУзла, "TabularSection"));
	
	Возврат Описание;
КонецФункции

Функция СтруктураУзлаВидаИмениИнструмента(ОписаниеXML)
	Внешний = Ложь;
	ЭтоОтчет = Ложь;
	
	УзелОбработки = ОписаниеXML._Элементы["MetaDataObject"];
	
	Если УзелОбработки._Элементы["Report"] <> Неопределено Тогда
		ЭтоОтчет = Истина;
	ИначеЕсли УзелОбработки._Элементы["ExternalReport"] <> Неопределено Тогда
		Внешний = Истина;
		ЭтоОтчет = Истина;
	ИначеЕсли УзелОбработки._Элементы["ExternalDataProcessor"] <> Неопределено Тогда
		Внешний = Истина;
	КонецЕсли;
	
	Возврат Новый Структура("Внешний,ЭтоОтчет", Внешний, ЭтоОтчет);
КонецФункции

Функция СинонимОбработки(ОписаниеОбработки, ИмяУзлаОбработки)
	Синоним = "";
	
	УзелОбработки = ОписаниеОбработки._Элементы["MetaDataObject"]._Элементы[ИмяУзлаОбработки]._Элементы["Properties"];
	
	УзелСинонима = УзелОбработки._Элементы["Synonym"];
	Если УзелСинонима = Неопределено Тогда
		Возврат Синоним;
	КонецЕсли;
	
	Язык = "ru";
	
	Если ТипЗнч(УзелСинонима._Элементы) = Тип("Соответствие") Тогда
		УзелЭлементаСинонима = УзелСинонима._Элементы["v8:item"];
	Иначе
		УзелЭлементаСинонима = Неопределено;
		Для Каждого Уз Из УзелСинонима._Элементы Цикл
			УзелЭлемента = Уз["v8:item"];
			
			ТекЯзык = "";
			УзелЯзыка = УзелЭлемента._Элементы["v8:lang"];
			Если УзелЯзыка.Свойство("_Значение") Тогда
				ТекЯзык = УзелЯзыка._Значение;
			КонецЕсли;
			Если ТекЯзык = Язык Тогда
				УзелЭлементаСинонима = УзелЭлемента;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если УзелЭлементаСинонима = Неопределено Тогда
			УзелЭлементаСинонима = УзелСинонима[0]["v8:item"];
		КонецЕсли;
	КонецЕсли;
	
	Если УзелЭлементаСинонима = Неопределено Тогда
		Возврат Синоним;
	КонецЕсли;
	
	Синоним = УзелЭлементаСинонима._Элементы["v8:content"]._Значение;
	
	Возврат Синоним;
КонецФункции


#КонецОбласти

#Область КонвертацияОбработкиВОВнешнюю


Процедура СконвертироватьОбработку(ТекИнструмент)
	ПреобразоватьКорневойФайлОбработкиДляПереводаЕеВоВнешнюю(ТекИнструмент);
	ПреобразоватьФайлыОписанийФормДляПереводаВоВнешнююОбработку(ТекИнструмент);
	ПроцессорXMLБезУпрощения.ЗаписатьВФайл(ТекИнструмент.ОписаниеXML, ТекИнструмент.ФайлОписания, Истина);
	
КонецПроцедуры

Функция ЗаменыСобытийЭлементовФормыДляТабличныйЧастейОбработки()
	Замены = Новый Соответствие;
	Замены.Вставить("OnEditEnd", "01d80ddd-dce5-4db3-beb5-f63c97cb05b9");
	Замены.Вставить("ValueChoice", "0d8cf5b0-55eb-4d1e-960a-22c160210945");
	Замены.Вставить("Selection", "1282f000-23b6-4887-87f4-9e8e79db3d32");
	Замены.Вставить("BeforeAddRow", "2391e7b8-7235-45d7-ab7e-6ff3dc086396");
	Замены.Вставить("OnCurrentParentChange", "2971b9a9-1724-4f34-aaa4-f3db584c3ca0");
	Замены.Вставить("BeforeDeleteRow", "2ccfdec5-583d-4eca-8319-e55de492665a");
	Замены.Вставить("BeforeEditEnd", "4d88756d-bad4-4fde-92e1-c1f1402ac6b2");
	Замены.Вставить("OnActivateRow", "60edb81d-887b-478e-94ee-7fef2b13393d");
	Замены.Вставить("OnActivateField", "6e973761-8683-47fa-a609-4e230950294d");
	Замены.Вставить("BeforeExpand", "7c39b7bc-db0f-4410-9d98-8e5b7896995e");
	Замены.Вставить("ChoiceProcessing", "8bfdb5eb-62dc-4851-8a2c-e983526356bf");
	Замены.Вставить("BeforeCollapse", "a7a9dc42-29b6-4c5b-8980-6d0b87149bdd");
	Замены.Вставить("BeforeRowChange", "ab930362-ff94-4dcb-ad16-188805d23e3c");
	Замены.Вставить("OnStartEdit", "b3c10170-c5ff-4cba-b537-679e1c872b45");
	Замены.Вставить("NewWriteProcessing", "ce67decf-16b8-4d61-b347-4e6a063580dc");
	Замены.Вставить("AfterDeleteRow", "de65638d-a806-4a76-bc10-f62bbc86e0e7");
	Замены.Вставить("OnActivateCell", "f228b12f-d892-4925-b338-695617357b32");
	Замены.Вставить("RefreshRequestProcessing", "ff33c4d6-a0db-4906-992e-37b3f44cd97a");
	
	// <Event name="01d80ddd-dce5-4db3-beb5-f63c97cb05b9">ТабличнаяЧасть1ПриОкончанииРедактирования</Event>
	// <Event name="DragCheck">ТабличнаяЧасть1ПроверкаПеретаскивания</Event>
	// <Event name="0d8cf5b0-55eb-4d1e-960a-22c160210945">ТабличнаяЧасть1ВыборЗначения</Event>
	// <Event name="1282f000-23b6-4887-87f4-9e8e79db3d32">ТабличнаяЧасть1Выбор</Event>
	// <Event name="2391e7b8-7235-45d7-ab7e-6ff3dc086396">ТабличнаяЧасть1ПередНачаломДобавления</Event>
	// <Event name="2971b9a9-1724-4f34-aaa4-f3db584c3ca0">ТабличнаяЧасть1ПриСменеТекущегоРодителя</Event>
	// <Event name="2ccfdec5-583d-4eca-8319-e55de492665a">ТабличнаяЧасть1ПередУдалением</Event>
	// <Event name="4d88756d-bad4-4fde-92e1-c1f1402ac6b2">ТабличнаяЧасть1ПередОкончаниемРедактирования</Event>
	// <Event name="60edb81d-887b-478e-94ee-7fef2b13393d">ТабличнаяЧасть1ПриАктивизацииСтроки</Event>
	// <Event name="DragStart">ТабличнаяЧасть1НачалоПеретаскивания</Event>
	// <Event name="6e973761-8683-47fa-a609-4e230950294d">ТабличнаяЧасть1ПриАктивизацииПоля</Event>
	// <Event name="7c39b7bc-db0f-4410-9d98-8e5b7896995e">ТабличнаяЧасть1ПередРазворачиванием</Event>
	// <Event name="Drag">ТабличнаяЧасть1Перетаскивание</Event>
	// <Event name="8bfdb5eb-62dc-4851-8a2c-e983526356bf">ТабличнаяЧасть1ОбработкаВыбора</Event>
	// <Event name="a7a9dc42-29b6-4c5b-8980-6d0b87149bdd">ТабличнаяЧасть1ПередСворачиванием</Event>
	// <Event name="ab930362-ff94-4dcb-ad16-188805d23e3c">ТабличнаяЧасть1ПередНачаломИзменения</Event>
	// <Event name="b3c10170-c5ff-4cba-b537-679e1c872b45">ТабличнаяЧасть1ПриНачалеРедактирования</Event>
	// <Event name="DragEnd">ТабличнаяЧасть1ОкончаниеПеретаскивания</Event>
	// <Event name="ce67decf-16b8-4d61-b347-4e6a063580dc">ТабличнаяЧасть1ОбработкаЗаписиНового</Event>
	// <Event name="de65638d-a806-4a76-bc10-f62bbc86e0e7">ТабличнаяЧасть1ПослеУдаления</Event>
	// <Event name="f228b12f-d892-4925-b338-695617357b32">ТабличнаяЧасть1ПриАктивизацииЯчейки</Event>
	// <Event name="OnChange">ТабличнаяЧасть1ПриИзменении</Event>
	// <Event name="ff33c4d6-a0db-4906-992e-37b3f44cd97a">ТабличнаяЧасть1ОбработкаЗапросаОбновления</Event>
	
	Возврат Замены;
КонецФункции

Процедура ПреобразоватьКорневойФайлОбработкиДляПереводаЕеВоВнешнюю(ТекИнструмент)
	
	ОписаниеXML = ТекИнструмент.ОписаниеXML;
	ИмяУзла = ТекИнструмент.ИмяУзла;
	ИмяВнешнегоОбъекта = "External" + ИмяУзла;
	
	КореньОбработки = ОписаниеXML._Элементы["MetaDataObject"];
	НастройкиОбработки = КореньОбработки._Элементы[ИмяУзла];
	КореньОбработки._Элементы.Удалить(ИмяУзла);
	КореньОбработки._Элементы.Вставить(ИмяВнешнегоОбъекта, НастройкиОбработки);
	
	СвойстваОбработки = НастройкиОбработки._Элементы["Properties"];
	Если СвойстваОбработки._Элементы["DefaultForm"].Свойство("_Значение") Тогда
		СвойстваОбработки._Элементы["DefaultForm"]._Значение = СтрЗаменить(СвойстваОбработки._Элементы["DefaultForm"]._Значение, ИмяУзла, ИмяВнешнегоОбъекта);
	КонецЕсли;
	
	УзелВспомогательнойФормы = СвойстваОбработки._Элементы["AuxiliaryForm"];
	Если УзелВспомогательнойФормы <> Неопределено Тогда
		Если УзелВспомогательнойФормы.Свойство("_Значение") Тогда
			УзелВспомогательнойФормы._Значение = СтрЗаменить(УзелВспомогательнойФормы._Значение, ИмяУзла, ИмяВнешнегоОбъекта);
		КонецЕсли;
	КонецЕсли;
	Если ТекИнструмент.ЭтоОтчет Тогда
		СхемаПоУмолчанию = "";
		Если СвойстваОбработки._Элементы["MainDataCompositionSchema"].Свойство("_Значение") Тогда
			СхемаПоУмолчанию = СвойстваОбработки._Элементы["MainDataCompositionSchema"]._Значение;
		КонецЕсли;
		
		Если Найти(СхемаПоУмолчанию, ИмяУзла) > 0 Тогда
			СвойстваОбработки._Элементы["MainDataCompositionSchema"]._Значение = СтрЗаменить(СхемаПоУмолчанию, ИмяУзла, ИмяВнешнегоОбъекта);
		КонецЕсли;
		
	КонецЕсли;
	СвойстваОбработки._Элементы.Удалить("UseStandardCommands");
	СвойстваОбработки._Элементы.Удалить("IncludeHelpInContents");
	СвойстваОбработки._Элементы.Удалить("ExtendedPresentation");
	СвойстваОбработки._Элементы.Удалить("Explanation");
	
	InternalInfo = НастройкиОбработки._Элементы["InternalInfo"]._Элементы;
	
	ИндексЭлементаМенеджера = Неопределено;
	Для н = 0 По InternalInfo.Количество() - 1 Цикл
		Элемент = InternalInfo[н];
		СтруктураЭлемента = Элемент["xr:GeneratedType"];
		
		Если СтруктураЭлемента = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		СтруктураЭлемента._Атрибуты["name"] = СтрЗаменить(СтруктураЭлемента._Атрибуты["name"], ИмяУзла, ИмяВнешнегоОбъекта);
		
		Если СтруктураЭлемента._Атрибуты["category"] = "Manager" Тогда
			ИндексЭлементаМенеджера = н;
		КонецЕсли;
		
	КонецЦикла;
	
	Если ИндексЭлементаМенеджера <> Неопределено Тогда
		InternalInfo.Удалить(ИндексЭлементаМенеджера);
	КонецЕсли;
	
	ContainedObject = Новый Соответствие();
	ContainedObject.Вставить("xr:ContainedObject", Новый Соответствие);
	Если ТекИнструмент.ЭтоОтчет Тогда
		ContainedObject["xr:ContainedObject"].Вставить("xr:ClassId", "e41aff26-25cf-4bb6-b6c1-3f478a75f374");
	Иначе
		ContainedObject["xr:ContainedObject"].Вставить("xr:ClassId", "c3831ec8-d8d5-4f93-8a22-f9bfae07327f");
	КонецЕсли;
	ContainedObject["xr:ContainedObject"].Вставить("xr:ObjectId", Строка(Новый УникальныйИдентификатор()));
	InternalInfo.Добавить(ContainedObject);
	
	ТекИнструмент.Вставить("ИмяУзлаВнешний", ИмяВнешнегоОбъекта);
КонецПроцедуры

Процедура ПреобразоватьЭлементФормыТаблицаСвязанныйСТабличнойЧастьюИнструмента(ТекИнструмент, УзелОписания)
	ЗаменыСобытийДляТаблиц = ЗаменыСобытийЭлементовФормыДляТабличныйЧастейОбработки();
	
	УзелСобытий = УзелОписания.Значение._Элементы["Events"];
	Если УзелСобытий <> Неопределено Тогда
		Для Каждого Событие Из УзелСобытий._Элементы Цикл
			УзелСобытия = УзелЭлемента(Событие);
			
			ИмяСобытия = УзелСобытия.Значение._Атрибуты["name"];
			Если ЗаменыСобытийДляТаблиц[ИмяСобытия] <> Неопределено Тогда
				УзелСобытия.Значение._Атрибуты["name"] = ЗаменыСобытийДляТаблиц[ИмяСобытия];
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	// Такое нужно убрать
	// 	<CommandSet>
	// 	<ExcludedCommand>Copy</ExcludedCommand>
	// </CommandSet>
	
	УзелКоманд = УзелОписания.Значение._Элементы["CommandSet"];
	Если УзелКоманд <> Неопределено Тогда
		УзелОписания.Значение._Элементы.Удалить("CommandSet");
	КонецЕсли;
КонецПроцедуры

Процедура УстановитьУЭлементовФормыОбщиеКартинки(УзелОписания, ПараметрОписания, ПапкаФормы)
	Для Каждого АтрибутКартинки Из ПараметрОписания.Значение._Элементы Цикл
		Если АтрибутКартинки.Ключ = "xr:Ref" Тогда
			Если Найти(АтрибутКартинки.Значение._Значение, "CommonPicture") > 0 Тогда
				МассивИмениКартинки = СтрРазделить(АтрибутКартинки.Значение._Значение, ".");
				ИмяКартинки = МассивИмениКартинки[1];
				
				ОбщаяКартинкаОписание = СоответствиеОбщихКартинок[ИмяКартинки];
				
				КартинкиВПапке = НайтиФайлы(ОбъединитьПути(ОбщаяКартинкаОписание.Каталог, "Ext", "Picture"), "*");
				Если КартинкиВПапке.Количество() = 0 Тогда
					Продолжить;
				КонецЕсли;
				
				ПапкаItems = ОбъединитьПути(ПапкаФормы, "Ext", "Form", "Items");
				ФС.ОбеспечитьКаталог(ПапкаItems);
				
				ПапкаКартинки = ОбъединитьПути(ПапкаItems, УзелОписания.Значение._Атрибуты["name"]);
				ФС.ОбеспечитьКаталог(ПапкаКартинки);
				
				ИмяФайлаКартинки = ПараметрОписания.Ключ + КартинкиВПапке[0].Расширение;
				
				КопироватьФайл(КартинкиВПапке[0].ПолноеИмя, ОбъединитьПути(ПапкаКартинки, ИмяФайлаКартинки));
				
				НоваяСтруктураКартинки = Новый Структура;
				НоваяСтруктураКартинки.Вставить("_Атрибуты", Новый Соответствие);
				НоваяСтруктураКартинки.Вставить("_Элементы", Новый Соответствие);
				НоваяСтруктураКартинки.Вставить("_Значение", ИмяФайлаКартинки);
				
				ПараметрОписания.Значение._Элементы.Вставить("xr:Abs", НоваяСтруктураКартинки);
				ПараметрОписания.Значение._Элементы.Удалить(АтрибутКартинки.Ключ);
				Прервать;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	
КонецПроцедуры

Функция ЗаменыСтандартныхКомандТаблицыСвязаннойСТабличнойЧастью()
	Замены = Новый Структура;
	Замены.Вставить("Add", "b0016a68-ec64-4e6d-b905-c71fd62efc4c");
	Замены.Вставить("Copy", "0ae4bea5-23be-42a7-b69e-97b11b29c453");
	Замены.Вставить("Change", "b41f5bbc-ba5d-4888-8cd1-db246a371418");
	Замены.Вставить("Delete", "8d772f97-c0ef-47c0-9cb0-efea28c61341");
	Замены.Вставить("EndEdit", "9ef79140-3de6-436a-8dda-610bb963f5db");
	Замены.Вставить("Find", "c0519548-2a9a-44de-a25e-faf01e089d4d");
	Замены.Вставить("CancelSearch", "44ad3ec9-f3c2-4913-9224-5f9fb6418743");
	Замены.Вставить("MoveUp", "37740564-9e86-44a0-bea9-3f485a5a3f91");
	Замены.Вставить("MoveDown", "fa51b106-eae6-44c7-8054-76cbb3100603");
	Замены.Вставить("SortListAsc", "2bbe4e12-06d2-409b-a972-eea585125d83");
	Замены.Вставить("SortListDesc", "58b2a785-23f6-4b0e-a324-9a1323285595");
	Замены.Вставить("OutputList", "49602716-fea6-497f-8047-726404038857");
	Замены.Вставить("SelectAll", "51c99108-107c-43e1-8918-e48835bf2495");
	Замены.Вставить("CopyToClipboard", "88078230-1f6b-415f-99e4-ad2ff73810cf");
	
	Возврат Замены;
КонецФункции

Процедура УстановитьИмяСтандартногоСобытияТаблицыСвязаннойСТабличнойчастьюИнструмента(ИмяКоманды, УзелОписания, СтруктураОписанияФормы)
	МассивИмениКоманды = СтрРазделить(ИмяКоманды, ".");
	
	Если МассивИмениКоманды.Количество() <> 5 Тогда
		Возврат;
	КонецЕсли;
	
	Если МассивИмениКоманды[3] <> "StandardCommand" Тогда
		Возврат;
	КонецЕсли;
	
	Замены = ЗаменыСтандартныхКомандТаблицыСвязаннойСТабличнойЧастью();
	
	УзелИмениКоманды = УзелОписания.Значение._Элементы["CommandName"];
	Если УзелИмениКоманды = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если НЕ СтруктураОписанияФормы.ЭлементыТЧОбработки.Свойство(МассивИмениКоманды[2]) Тогда
		Возврат;
	КонецЕсли;
	
	УзелИмениКоманды._Значение = СтруктураОписанияФормы.ЭлементыТЧОбработки[МассивИмениКоманды[2]].id + ":" + Замены[МассивИмениКоманды[4]];
КонецПроцедуры

Процедура ПреобразоватьПодчиненныеЭлементыФормы(ТекИнструмент, ЭлементыФормы, СтруктураОписанияФормы, ПапкаФормы)
	Если ЭлементыФормы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого ОписаниеЭлемента Из ЭлементыФормы._Элементы Цикл
		УзелОписания = УзелЭлемента(ОписаниеЭлемента);
		Если ТекИнструмент <> Неопределено Тогда
			Если УзелОписания.Ключ = "Table" Тогда
				УзелПутьКДанным = УзелОписания.Значение._Элементы["DataPath"];
				Если УзелПутьКДанным <> Неопределено Тогда
					Если Найти(НРег(УзелПутьКДанным._Значение), "объект") > 0 Тогда
						МассивПутьКДанным = СтрРазделить(УзелПутьКДанным._Значение, ".");
						Если МассивПутьКДанным.Количество() = 2 Тогда
							Если ТекИнструмент.ТабличныеЧасти.Найти(МассивПутьКДанным[1]) <> Неопределено Тогда
								ПреобразоватьЭлементФормыТаблицаСвязанныйСТабличнойЧастьюИнструмента(ТекИнструмент, УзелОписания);
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				
			КонецЕсли;
		КонецЕсли;
		
		// Обходим описание элемента в поисках картинок
		ЕстьКартинка = Ложь;
		Для Каждого ПараметрОписания Из УзелОписания.Значение._Элементы Цикл
			Если Найти(НРег(ПараметрОписания.Ключ), "picture") = 0 Тогда
				Продолжить;
			КонецЕсли;
			
			Если Найти(НРег(ПараметрОписания.Ключ), "path") > 0 Тогда
				Продолжить;
			КонецЕсли;
			
			ЕстьКартинка = Истина;
			УстановитьУЭлементовФормыОбщиеКартинки(УзелОписания, ПараметрОписания, ПапкаФормы);
		КонецЦикла;
		
		Если УзелОписания.Ключ = "Button" Тогда
			УзелОписанияКоманды = УзелОписания.Значение._Элементы["CommandName"];
			Если УзелОписанияКоманды <> Неопределено Тогда
				ИмяКоманды = УзелОписанияКоманды._Значение;
			Иначе
				ИмяКоманды = "";
			КонецЕсли;
			МассивИменаКоманды = СтрРазделить(ИмяКоманды, ".");
			
			УстановитьИмяСтандартногоСобытияТаблицыСвязаннойСТабличнойчастьюИнструмента(ИмяКоманды, УзелОписания, СтруктураОписанияФормы);
			
			Если НЕ ЕстьКартинка Тогда
				
				Если МассивИменаКоманды.Количество() = 3 Тогда
					Если МассивИменаКоманды[0] = "Form"
						И МассивИменаКоманды[1] = "Command" Тогда
						
						ОписаниеКоманды = СтруктураОписанияФормы.Команды[НРег(МассивИменаКоманды[2])];
						
						Если ОписаниеКоманды.Картинка <> Неопределено Тогда
							Если Найти(ОписаниеКоманды.Картинка, "CommonPicture") > 0 Тогда
								МассивИмениКартинки = СтрРазделить(ОписаниеКоманды.Картинка, ".");
								ИмяКартинки = МассивИмениКартинки[1];
								
								ОбщаяКартинкаОписание = СоответствиеОбщихКартинок[ИмяКартинки];
								
								КартинкиВПапке = НайтиФайлы(ОбъединитьПути(ОбщаяКартинкаОписание.Каталог, "Ext", "Picture"), "*");
								Если КартинкиВПапке.Количество() = 0 Тогда
									Продолжить;
								КонецЕсли;
								
								НовыйПараметрОписания = Новый Структура;
								НовыйПараметрОписания.Вставить("_Атрибуты", Новый Соответствие);
								НовыйПараметрОписания.Вставить("_Элементы", Новый Соответствие);
								
								ПапкаItems = ОбъединитьПути(ПапкаФормы, "Ext", "Form", "Items");
								ФС.ОбеспечитьКаталог(ПапкаItems);
								
								ПапкаКартинки = ОбъединитьПути(ПапкаItems, УзелОписания.Значение._Атрибуты["name"]);
								ФС.ОбеспечитьКаталог(ПапкаКартинки);
								
								ИмяФайлаКартинки = "Picture" + КартинкиВПапке[0].Расширение;
								
								КопироватьФайл(КартинкиВПапке[0].ПолноеИмя, ОбъединитьПути(ПапкаКартинки, ИмяФайлаКартинки));
								
								НоваяСтруктураКартинки = Новый Структура;
								НоваяСтруктураКартинки.Вставить("_Атрибуты", Новый Соответствие);
								НоваяСтруктураКартинки.Вставить("_Элементы", Новый Соответствие);
								НоваяСтруктураКартинки.Вставить("_Значение", ИмяФайлаКартинки);
								
								НовыйПараметрОписания._Элементы.Вставить("xr:Abs", НоваяСтруктураКартинки);
								
								НоваяСтруктураКартинки = Новый Структура;
								НоваяСтруктураКартинки.Вставить("_Атрибуты", Новый Соответствие);
								НоваяСтруктураКартинки.Вставить("_Элементы", Новый Соответствие);
								НоваяСтруктураКартинки.Вставить("_Значение", Ложь);
								
								НовыйПараметрОписания._Элементы.Вставить("xr:LoadTransparent", НоваяСтруктураКартинки);
								
								УзелОписания.Значение._Элементы["Picture"] = НовыйПараметрОписания;
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			
			
		КонецЕсли;
		
		
		Если ТекИнструмент <> Неопределено Тогда
			УзелFooterDataPath = УзелОписания.Значение._Элементы["FooterDataPath"];
			Если УзелFooterDataPath <> Неопределено Тогда
				Если УзелFooterDataPath.Свойство("_Значение") Тогда
					МассивПутиКДаннымПодвала = СтрРазделить(УзелFooterDataPath._Значение, ".");
					Если МассивПутиКДаннымПодвала.Количество() = 3 Тогда
						Если НРег(МассивПутиКДаннымПодвала[0]) = "объект"
							И ТекИнструмент.ТабличныеЧасти.Найти(МассивПутиКДаннымПодвала[1]) <> Неопределено
							И СтрНачинаетсяС(МассивПутиКДаннымПодвала[2], "Total") Тогда
							МассивПутиКДаннымПодвала[2] = Сред(МассивПутиКДаннымПодвала[2], СтрДлина("Total") + 1);
							УзелFooterDataPath._Значение = СтрСоединить(МассивПутиКДаннымПодвала, ".");
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		ПреобразоватьПодчиненныеЭлементыФормы(ТекИнструмент, УзелОписания.Значение._Элементы["ChildItems"], СтруктураОписанияФормы, ПапкаФормы);
		
		КоманднаяПанельФормыXML = УзелОписания.Значение._Элементы["AutoCommandBar"];
		
		Если КоманднаяПанельФормыXML <> Неопределено Тогда
			ПреобразоватьПодчиненныеЭлементыФормы(ТекИнструмент, КоманднаяПанельФормыXML._Элементы["ChildItems"], СтруктураОписанияФормы, ПапкаФормы);
		КонецЕсли;
		КонтекстноеМенюФормыXML = УзелОписания.Значение._Элементы["ContextMenu"];
		
		Если КонтекстноеМенюФормыXML <> Неопределено Тогда
			ПреобразоватьПодчиненныеЭлементыФормы(ТекИнструмент, КонтекстноеМенюФормыXML._Элементы["ChildItems"], СтруктураОписанияФормы, ПапкаФормы);
		КонецЕсли;
		
	КонецЦикла;
КонецПроцедуры

Процедура ЗаполнитьЭлементыФормыСвязанныеСТабличнымиЧастямиИнструмента(ТекИнструмент, ЭлементыФормы, СтруктураОписанияФормы)
	Если ЭлементыФормы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого ОписаниеЭлемента Из ЭлементыФормы._Элементы Цикл
		УзелОписания = УзелЭлемента(ОписаниеЭлемента);
		
		Если УзелОписания.Ключ = "Table" Тогда
			УзелПутьКДанным = УзелОписания.Значение._Элементы["DataPath"];
			Если УзелПутьКДанным <> Неопределено Тогда
				Если Найти(НРег(УзелПутьКДанным._Значение), "объект") > 0 Тогда
					МассивПутьКДанным = СтрРазделить(УзелПутьКДанным._Значение, ".");
					Если МассивПутьКДанным.Количество() = 2 Тогда
						Если ТекИнструмент.ТабличныеЧасти.Найти(МассивПутьКДанным[1]) <> Неопределено Тогда
							ОписаниеЭлементаТЧ = Новый Структура;
							ОписаниеЭлементаТЧ.Вставить("ТЧ", МассивПутьКДанным[1]);
							ОписаниеЭлементаТЧ.Вставить("id", УзелОписания.Значение._Атрибуты["id"]);
							
							СтруктураОписанияФормы.ЭлементыТЧОбработки.Вставить(УзелОписания.Значение._Атрибуты["name"], ОписаниеЭлементаТЧ);
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			
		КонецЕсли;
		
		ЗаполнитьЭлементыФормыСвязанныеСТабличнымиЧастямиИнструмента(ТекИнструмент, УзелОписания.Значение._Элементы["ChildItems"], СтруктураОписанияФормы);
		
	КонецЦикла;
КонецПроцедуры

Процедура ПреобразоватьОписаниеОбщейФормы(КаталогПодчиненныхОбъектовОбработки, ИмяФормы)
	ПапкаФормы = ОбъединитьПути(КаталогПодчиненныхОбъектовОбработки, ИмяФормы);
	
	ФайлОписанияФормы = ОбъединитьПути(ПапкаФормы, "Ext", "Form.xml");
	ОписаниеФормы = ПроцессорXMLБезУпрощения.ПрочитатьИзФайла(ФайлОписанияФормы);
	
	ЭлементыXMLФорма = ОписаниеФормы._Элементы["Form"];
	
	СтруктураОписанияФормы = Новый Структура;
	СтруктураОписанияФормы.Вставить("Реквизиты", Новый Массив);
	СтруктураОписанияФормы.Вставить("Команды", Новый Структура);
	СтруктураОписанияФормы.Вставить("ЭлементыТЧОбработки", Новый Структура);
	
	ПреобразоватьКомандыФормы(ЭлементыXMLФорма, ПапкаФормы, СтруктураОписанияФормы);
	
	// преобразуем элементы формы.
	ПреобразоватьПодчиненныеЭлементыФормы(Неопределено, ЭлементыXMLФорма._Элементы["ChildItems"], СтруктураОписанияФормы, ПапкаФормы);
	
	КоманднаяПанельФормыXML = ЭлементыXMLФорма._Элементы["AutoCommandBar"];
	
	Если КоманднаяПанельФормыXML <> Неопределено Тогда
		ПреобразоватьПодчиненныеЭлементыФормы(Неопределено, КоманднаяПанельФормыXML._Элементы["ChildItems"], СтруктураОписанияФормы, ПапкаФормы);
	КонецЕсли;
	КонтекстноеМенюФормыXML = ЭлементыXMLФорма._Элементы["ContextMenu"];
	
	Если КонтекстноеМенюФормыXML <> Неопределено Тогда
		ПреобразоватьПодчиненныеЭлементыФормы(Неопределено, КонтекстноеМенюФормыXML._Элементы["ChildItems"], СтруктураОписанияФормы, ПапкаФормы);
	КонецЕсли;
	
	ПроцессорXMLБезУпрощения.ЗаписатьВФайл(ОписаниеФормы, ФайлОписанияФормы, Истина);
КонецПроцедуры

Процедура ПреобразоватьКомандыФормы(ЭлементыXMLФорма, ПапкаФормы, СтруктураОписанияФормы)
	КомандыФормы = ЭлементыXMLФорма._Элементы["Commands"];
	Если КомандыФормы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Для Каждого ТекКоманда Из КомандыФормы._Элементы Цикл
		Если ТипЗнч(ТекКоманда) = Тип("КлючИЗначение") Тогда
			ОписаниеТекКоманды = ТекКоманда.Значение;
		Иначе
			ОписаниеТекКоманды = ТекКоманда["Command"];
		КонецЕсли;
		
		ОписаниеКоманды = Новый Структура;
		ОписаниеКоманды.Вставить("Имя", ОписаниеТекКоманды._Атрибуты["name"]);
		ОписаниеКоманды.Вставить("Картинка", Неопределено);
		
		УдаляемыеЭлементыКоманды = Новый Массив();
		
		Для Каждого ЭлементОписанияКоманды Из ОписаниеТекКоманды._Элементы Цикл
			Если НРег(ЭлементОписанияКоманды.Ключ) = "picture" Тогда
				
				Для Каждого ПараметрКартинки Из ЭлементОписанияКоманды.Значение._Элементы Цикл
					ИмяКартинки = ПараметрКартинки.Значение._Значение;
					
					Если СтрНачинаетсяС(ИмяКартинки, "CommonPicture") Тогда
						УдаляемыеЭлементыКоманды.Добавить(ЭлементОписанияКоманды.Ключ);
					КонецЕсли;
					
					ОписаниеКоманды.Картинка = ПараметрКартинки.Значение._Значение;
					Прервать;
				КонецЦикла;
			КонецЕсли;
		КонецЦикла;
		
		Для Каждого КлючУдаялемый Из УдаляемыеЭлементыКоманды Цикл
			ОписаниеТекКоманды._Элементы.Удалить(КлючУдаялемый);
		КонецЦикла;
		
		СтруктураОписанияФормы.Команды.Вставить(ОписаниеКоманды.Имя, ОписаниеКоманды);
	КонецЦикла;
	
КонецПроцедуры

Процедура ПреобразоватьОписаниеФормыДляПереводаВоВнешнююОбработку(ТекИнструмент, ИмяФормы)
	ПапкаФормы = ОбъединитьПути(ТекИнструмент.Каталог, "Forms", ИмяФормы);
	
	ФайлОписанияФормы = ОбъединитьПути(ПапкаФормы, "Ext", "Form.xml");
	ОписаниеФормы = ПроцессорXMLБезУпрощения.ПрочитатьИзФайла(ФайлОписанияФормы);
	
	ЭлементыXMLФорма = ОписаниеФормы._Элементы["Form"];
	
	ИмяУзлаОбъект = ТекИнструмент.ИмяУзла + "Object";
	
	СтруктураОписанияФормы = Новый Структура;
	СтруктураОписанияФормы.Вставить("Реквизиты", Новый Массив);
	СтруктураОписанияФормы.Вставить("Команды", Новый Структура);
	СтруктураОписанияФормы.Вставить("ЭлементыТЧОбработки", Новый Структура);
	
	РеквизитыФормы = ЭлементыXMLФорма._Элементы["Attributes"];
	Если РеквизитыФормы <> Неопределено Тогда
		// преобразуем реквизиты формы
		Для Каждого Реквизит Из РеквизитыФормы._Элементы Цикл
			Если ТипЗнч(Реквизит) = Тип("КлючИЗначение") Тогда
				Структураатрибута = Реквизит.Значение;
			Иначе
				Структураатрибута = Реквизит["Attribute"];
			КонецЕсли;
			Если Структураатрибута = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			СтруктураОписанияФормы.Реквизиты.Добавить(Структураатрибута._Атрибуты["name"]);
			
			ТипРеквзита = Структураатрибута._Элементы["Type"]._Элементы;
			Если ТипЗнч(ТипРеквзита) <> Тип("Соответствие") Тогда
				Продолжить;
			КонецЕсли;
			
			ЭлементТипа = ТипРеквзита["v8:Type"];
			Если ЭлементТипа = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			Если СтрНайти(ТипРеквзита["v8:Type"]._Значение, ИмяУзлаОбъект) > 0 Тогда
				ТипРеквзита["v8:Type"]._Значение = СтрЗаменить(ТипРеквзита["v8:Type"]._Значение, ИмяУзлаОбъект, "External" + ИмяУзлаОбъект);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	ПреобразоватьКомандыФормы(ЭлементыXMLФорма, ПапкаФормы, СтруктураОписанияФормы);
	
	ЗаполнитьЭлементыФормыСвязанныеСТабличнымиЧастямиИнструмента(ТекИнструмент, ЭлементыXMLФорма._Элементы["ChildItems"], СтруктураОписанияФормы);
	
	// преобразуем элементы формы.
	ПреобразоватьПодчиненныеЭлементыФормы(ТекИнструмент, ЭлементыXMLФорма._Элементы["ChildItems"], СтруктураОписанияФормы, ПапкаФормы);
	
	КоманднаяПанельФормыXML = ЭлементыXMLФорма._Элементы["AutoCommandBar"];
	
	Если КоманднаяПанельФормыXML <> Неопределено Тогда
		ПреобразоватьПодчиненныеЭлементыФормы(ТекИнструмент, КоманднаяПанельФормыXML._Элементы["ChildItems"], СтруктураОписанияФормы, ПапкаФормы);
	КонецЕсли;
	КонтекстноеМенюФормыXML = ЭлементыXMLФорма._Элементы["ContextMenu"];
	
	Если КонтекстноеМенюФормыXML <> Неопределено Тогда
		ПреобразоватьПодчиненныеЭлементыФормы(ТекИнструмент, КонтекстноеМенюФормыXML._Элементы["ChildItems"], СтруктураОписанияФормы, ПапкаФормы);
	КонецЕсли;
	
	ПроцессорXMLБезУпрощения.ЗаписатьВФайл(ОписаниеФормы, ФайлОписанияФормы, Истина);
	
КонецПроцедуры

Процедура ПреобразоватьФайлыОписанийФормДляПереводаВоВнешнююОбработку(ТекИнструмент)
	Для Каждого ИмяФормы Из ТекИнструмент.Формы Цикл
		ПреобразоватьОписаниеФормыДляПереводаВоВнешнююОбработку(ТекИнструмент, ИмяФормы);
	КонецЦикла;
КонецПроцедуры



#КонецОбласти

#Область КонвертацияМодулей

Процедура ДобавитьИнформациюОСборкеВОбщийМодуль(ИмяФайла)
	Исходник = ТекстМодуля(ИмяФайла);
	
	Парсер = Новый ПарсерВстроенногоЯзыка;
	
	ПлагинУстановкаВариантаСборки = Новый УстановкаВариантаСборки();
	
	Плагины = Новый Массив();
	Плагины.Добавить(ПлагинУстановкаВариантаСборки);
	
	НастройкиПлагина = Новый Структура;
	НастройкиПлагина.Вставить("ВариантСборки", ВариантСборки);
	НастройкиПлагина.Вставить("Версия", ОписаниеРасширения.Версия);
	НастройкиПлагина.Вставить("ВКонфигурацию", Неопределено);
	
	ПараметрыПлагинов = Новый Соответствие;
	ПараметрыПлагинов[ПлагинУстановкаВариантаСборки] = НастройкиПлагина;
	
	Результаты = Парсер.Пуск(Исходник, Плагины, ПараметрыПлагинов);
	
	Замены = Парсер.ТаблицаЗамен();
	Если Замены.Количество() > 0 Тогда
		НовыйИсходник = Парсер.ВыполнитьЗамены();
		ЗаписатьМодуль(НовыйИсходник, ИмяФайла);
	КонецЕсли;
КонецПроцедуры


Функция ДобавитьДирективуМетодовМодуля(ТекстМодуля, Директива)
	Парсер = Новый ПарсерВстроенногоЯзыка;
	
	ПлагинУстановитьДирективыУМетодов = Новый УстановитьДирективыУМетодов();
	
	Плагины = Новый Массив();
	Плагины.Добавить(ПлагинУстановитьДирективыУМетодов);
	
	ПараметрыПлагинов = Новый Соответствие;
	ПараметрыПлагинов[ПлагинУстановитьДирективыУМетодов] = Директива;
	
	Результаты = Парсер.Пуск(ТекстМодуля, Плагины, ПараметрыПлагинов);
	
	Замены = Парсер.ТаблицаЗамен();
	Если Замены.Количество() > 0 Тогда
		НовыйИсходник = Парсер.ВыполнитьЗамены();
	Иначе
		НовыйИсходник = ТекстМодуля;
	КонецЕсли;
	
	
	Возврат НовыйИсходник;
КонецФункции

Процедура ЗаменитьПеременныеВМодуле(ИмяФайлаМодуля, СтруктураПереименованийПеременныхМодулей, ЭтоМодульФормы)
	Парсер = Новый ПарсерВстроенногоЯзыка;
	
	ПлагинПереименованияПеременных = Новый ПереименованиеПеременных();
	ПлагинППереопределитьМетодОбщийМодуль = Новый ПереопределитьМетодОбщийМодуль;
	ПлагинЗаменаПолученияОбщихМодулейЧерезМетодКонфигурацииОбщийМодуль = Новый ЗаменаПолученияОбщихМодулейЧерезМетодКонфигурацииОбщийМодуль;
	ПлагинЗаменаОткрытияФормНаНовоеРасположениеОбработки = Новый ЗаменаОткрытияФормНаНовоеРасположениеОбработки;
	ПлагинЗаменаПолученияОбщихМакетовНаГлавнуюОбработку = Новый ЗаменаПолученияОбщихМакетовНаГлавнуюОбработку;
	ПлагинЗаменаОбращенияКОбщимКартинкамИУНаОбщениеКПроцедуре = Новый ЗаменаОбращенияКОбщимКартинкамИУНаОбщениеКПроцедуре;
	ПлагинКонвертацияВызоваМетодовМодулейМенеджераИнструметров = Новый КонвертацияВызоваМетодовМодулейМенеджераИнструметров;
	ПлагинИзменитьПолучениеОбщихМодулейЧерезМетодВычислить = Новый ИзменитьПолучениеОбщихМодулейЧерезМетодВычислить;
	ПлагинКонвертацияВызоваМетодовОбщихМодулей = Новый КонвертацияВызоваМетодовОбщихМодулей;
	
	Плагины = Новый Массив();
	Плагины.Добавить(ПлагинППереопределитьМетодОбщийМодуль);
	Плагины.Добавить(ПлагинЗаменаПолученияОбщихМодулейЧерезМетодКонфигурацииОбщийМодуль);
	Плагины.Добавить(ПлагинЗаменаОткрытияФормНаНовоеРасположениеОбработки);
	Плагины.Добавить(ПлагинПереименованияПеременных);
	Плагины.Добавить(ПлагинЗаменаПолученияОбщихМакетовНаГлавнуюОбработку);
	Плагины.Добавить(ПлагинЗаменаОбращенияКОбщимКартинкамИУНаОбщениеКПроцедуре);
	Плагины.Добавить(ПлагинКонвертацияВызоваМетодовМодулейМенеджераИнструметров);
	Плагины.Добавить(ПлагинИзменитьПолучениеОбщихМодулейЧерезМетодВычислить);
	Плагины.Добавить(ПлагинКонвертацияВызоваМетодовОбщихМодулей);
	
	ПараметрыПлагинаЗаменыОткрытияФорм = Новый Структура;
	ПараметрыПлагинаЗаменыОткрытияФорм.Вставить("ПрефиксПеременныхИПроцедур", ПрефиксПеременныхИПроцедур);
	ПараметрыПлагинаЗаменыОткрытияФорм.Вставить("ОписаниеКонфигурации", ОписаниеРасширения);
	ПараметрыПлагинаЗаменыОткрытияФорм.Вставить("ЭтоМодульФормы", ЭтоМодульФормы);
	
	ПараметрыПлагинаЗаменыПолученияОбщихМакетов = Новый Структура;
	ПараметрыПлагинаЗаменыПолученияОбщихМакетов.Вставить("ИмяГлавнойОбработки", ИмяГлавнойОбработки);
	
	ПараметрыПлагинов = Новый Соответствие;
	ПараметрыПлагинов[ПлагинППереопределитьМетодОбщийМодуль] = ПрефиксПеременныхИПроцедур;
	ПараметрыПлагинов[ПлагинЗаменаОткрытияФормНаНовоеРасположениеОбработки] = ПараметрыПлагинаЗаменыОткрытияФорм;
	ПараметрыПлагинов[ПлагинЗаменаПолученияОбщихМодулейЧерезМетодКонфигурацииОбщийМодуль] = Неопределено;
	ПараметрыПлагинов[ПлагинПереименованияПеременных] = СтруктураПереименованийПеременныхМодулей;
	ПараметрыПлагинов[ПлагинЗаменаПолученияОбщихМакетовНаГлавнуюОбработку] = ПараметрыПлагинаЗаменыПолученияОбщихМакетов;
	ПараметрыПлагинов[ПлагинЗаменаОбращенияКОбщимКартинкамИУНаОбщениеКПроцедуре] = ПараметрыПлагинаЗаменыОткрытияФорм;
	ПараметрыПлагинов[ПлагинКонвертацияВызоваМетодовМодулейМенеджераИнструметров] = ПараметрыПлагинаЗаменыОткрытияФорм;
	ПараметрыПлагинов[ПлагинИзменитьПолучениеОбщихМодулейЧерезМетодВычислить] = ПараметрыПлагинаЗаменыОткрытияФорм;
	ПараметрыПлагинов[ПлагинКонвертацияВызоваМетодовОбщихМодулей] = ПараметрыПлагинаЗаменыОткрытияФорм;
	
	ТекстовыйДокумент = Новый ТекстовыйДокумент();
	ТекстовыйДокумент.Прочитать(ИмяФайлаМодуля);
	Исходник = ТекстовыйДокумент.ПолучитьТекст();
	Результаты = Парсер.Пуск(Исходник, Плагины, ПараметрыПлагинов);
	
	Замены = Парсер.ТаблицаЗамен();
	Если Замены.Количество() > 0 Тогда
		НовыйИсходник = Парсер.ВыполнитьЗамены();
		ТекстовыйДокумент.УстановитьТекст(НовыйИсходник);
		ТекстовыйДокумент.Записать(ИмяФайлаМодуля);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура СконвертироватьМодульФормыОбщегоМодуляДляВызоваСервера(ИмяФайлаМодуля)
	Если НЕ ФС.ФайлСуществует(ИмяФайлаМодуля) Тогда
		Возврат;
	КонецЕсли;
	
	Исходник = ТекстМодуля(ИмяФайлаМодуля);
	Парсер = Новый ПарсерВстроенногоЯзыка;
	ПлагинЗаменаВызоваПроцедурВызовСервера = Новый ЗаменаВызоваПроцедурВызовСервера;
	
	Плагины = Новый Массив();
	Плагины.Добавить(ПлагинЗаменаВызоваПроцедурВызовСервера);
	
	ПараметрыДобавленияОбщихМодулей = Новый Структура;
	// ПараметрыДобавленияОбщихМодулей.Вставить("МассивОбщихМодулей", ОписаниеКонфигурации.ОбщиеМодули);
	// ПараметрыДобавленияОбщихМодулей.Вставить("ЭтоМодульФормы", ЭтоМодульФормы);
	ПараметрыДобавленияОбщихМодулей.Вставить("ПрефиксПеременныхИПроцедур", ПрефиксПеременныхИПроцедур);
	
	ПараметрыПлагинов = Новый Соответствие;
	ПараметрыПлагинов[ПлагинЗаменаВызоваПроцедурВызовСервера] = ПараметрыДобавленияОбщихМодулей;
	Результаты = Парсер.Пуск(Исходник, Плагины, ПараметрыПлагинов);
	
	Замены = Парсер.ТаблицаЗамен();
	НовыйИсходник = Парсер.ВыполнитьЗамены();
	Если Замены.Количество() > 0 Тогда
		ЗаписатьМодуль(НовыйИсходник, ИмяФайлаМодуля);
	КонецЕсли;
КонецПроцедуры

Процедура СконвертироватьМодулиПортативнойПоставки()
	Для Каждого ТекИнструмент Из СтруктураПортативныхИнструментов.Инструменты Цикл
		ОписаниеИнструмента = ТекИнструмент.Значение;
		Для Каждого ИмяФормы Из ОписаниеИнструмента.Формы Цикл
			ИмяФайлаФормы = ОбъединитьПути(
			ОбъединитьПути(ОписаниеИнструмента.Каталог, "Forms", ИмяФормы),
			"Ext",
			"Form",
			"Module.bsl");
			
			СконвертироватьМодуль(ИмяФайлаФормы, Истина);
		КонецЦикла;
		
		ИмяФайлаМодуля = ОбъединитьПути(ОписаниеИнструмента.Каталог, "Ext", "ObjectModule.bsl");
		СконвертироватьМодуль(ИмяФайлаМодуля, Ложь);
	КонецЦикла;
	
	ИмяФормы = "Форма";
	Для Каждого ОбщийМодуль Из СтруктураПортативныхИнструментов.ОбщиеМодули Цикл
		ОписаниеИнструмента = ОбщийМодуль.Значение;
		ЭтоОбщегоНазначения = ОписаниеИнструмента.Имя = "УИ_ОбщегоНазначенияКлиентСервер";
		
		Если ОписаниеИнструмента.Клиент Тогда
			ИмяФайлаФормы = ОбъединитьПути(
			ОбъединитьПути(ОписаниеИнструмента.Каталог, "Forms", ИмяФормы),
			"Ext",
			"Form",
			"Module.bsl");
			
			ТекстОбщегоМодуля = ТекстМодуля(ИмяФайлаФормы);
			ТекстОбщегоМодуля = ДобавитьДирективуМетодовМодуля(ТекстОбщегоМодуля, "&НаКлиенте");
			ЗаписатьМодуль(ТекстОбщегоМодуля, ИмяФайлаФормы);
			
			СконвертироватьМодуль(ИмяФайлаФормы, Истина, , Истина);
			
			Если ЭтоОбщегоНазначения Тогда
				ДобавитьИнформациюОСборкеВОбщийМодуль(ИмяФайлаФормы);
			КонецЕсли;
			
		ИначеЕсли ОписаниеИнструмента.ВызовСервера Тогда
			ИмяФайлаФормы = ОбъединитьПути(
			ОбъединитьПути(ОписаниеИнструмента.Каталог, "Forms", ИмяФормы),
			"Ext",
			"Form",
			"Module.bsl");
			
			ТекстОбщегоМодуля = ТекстМодуля(ИмяФайлаФормы);
			ТекстОбщегоМодуля = ДобавитьДирективуМетодовМодуля(ТекстОбщегоМодуля, "&НаКлиенте");
			ЗаписатьМодуль(ТекстОбщегоМодуля, ИмяФайлаФормы);
			
			СконвертироватьМодульФормыОбщегоМодуляДляВызоваСервера(ИмяФайлаФормы);
		КонецЕсли;
		
		// Если ОписаниеИнструмента.Сервер Тогда
		ИмяФайлаМодуля = ОбъединитьПути(ОписаниеИнструмента.Каталог, "Ext", "ObjectModule.bsl");
		
		СконвертироватьМодуль(ИмяФайлаМодуля, Ложь, , Истина, ОписаниеИнструмента.Клиент);
		Если ЭтоОбщегоНазначения Тогда
			ДобавитьИнформациюОСборкеВОбщийМодуль(ИмяФайлаМодуля);
		КонецЕсли;
		
		// КонецЕсли;
		
	КонецЦикла;
	
	
КонецПроцедуры

Процедура СконвертироватьМодуль(ИмяФайлаМодуля, ЭтоМодульФормы, ЭтоГлавнаяОбработка = Ложь, ЭтоОбщийМодуль = Ложь, ЭтоКлиентскийОбщийМодуль = Ложь)
	Если НЕ ФС.ФайлСуществует(ИмяФайлаМодуля) Тогда
		Возврат;
	КонецЕсли;
	
	Исходник = ТекстМодуля(ИмяФайлаМодуля);
	
	СтруктураПереименованийПеременныхМодулей = Новый Структура;
	// Для Каждого КлючЗначение Из СтруктураПортативныхИнструментов.ОбщиеМодули Цикл
	// 	Модуль=КлючЗначение.Значение;
	// 	Если Модуль.ЭтоМодульМенеджера Тогда
	// 		Продолжить;
	// 	КонецЕсли;
	// 	СтруктураПереименованийПеременныхМодулей.Вставить(Модуль.Имя, ПрефиксПеременныхИПроцедур+"ОбщийМодульПоИмени("""+Модуль.Имя+""")");
	// КонецЦикла;
	Если ЭтоМодульФормы И НЕ ЭтоГлавнаяОбработка Тогда
		СтруктураПереименованийПеременныхМодулей.Вставить("ЭтотОбъект", "ЭтаФорма");
		СтруктураПереименованийПеременныхМодулей.Вставить("УИ_ПараметрыПриложения", ПрефиксПеременныхИПроцедур + "УИ_ПараметрыПриложения()");
		
		Если ЭтоОбщийМодуль Тогда
			СтруктураПереименованийПеременныхМодулей.Вставить("Параметры", ПрефиксПеременныхИПроцедур + "Параметры");
		КонецЕсли;
	ИначеЕсли ЭтоОбщийМодуль И ЭтоКлиентскийОбщийМодуль Тогда
		СтруктураПереименованийПеременныхМодулей.Вставить("УИ_ПараметрыПриложения", ПрефиксПеременныхИПроцедур + "УИ_ПараметрыПриложения()");
	КонецЕсли;
	// совместимость строковых функций с старыми платформами
	СтруктураПереименованийПеременныхМодулей.Вставить("СтрНачинаетсяС", "_СтрНачинаетсяС");
	СтруктураПереименованийПеременныхМодулей.Вставить("СтрЗаканчиваетсяНа", "_СтрЗаканчиваетсяНа");
	СтруктураПереименованийПеременныхМодулей.Вставить("СтрРазделить", "_СтрРазделить");
	СтруктураПереименованийПеременныхМодулей.Вставить("СтрСоединить", "_СтрСоединить");
	СтруктураПереименованийПеременныхМодулей.Вставить("СтрНайти", "_СтрНайти");
	СтруктураПереименованийПеременныхМодулей.Вставить("СтрШаблон", "_СтрШаблон");
	СтруктураПереименованийПеременныхМодулей.Вставить("УстановитьОтключениеБезопасногоРежима", "//УстановитьОтключениеБезопасногоРежима");
	СтруктураПереименованийПеременныхМодулей.Вставить("НаправлениеПоиска", "_НаправленияПоискаСтрНайти()");
	
	Парсер = Новый ПарсерВстроенногоЯзыка;
	ПлагинДобавлениеВызововОбщихМодулей = Новый ДобавлениеВызоваОбщихМодулей;
	
	Плагины = Новый Массив();
	Плагины.Добавить(ПлагинДобавлениеВызововОбщихМодулей);
	
	ПараметрыДобавленияОбщихМодулей = Новый Структура;
	ПараметрыДобавленияОбщихМодулей.Вставить("ЭтоМодульФормы", ЭтоМодульФормы);
	ПараметрыДобавленияОбщихМодулей.Вставить("ПрефиксПеременныхИПроцедур", ПрефиксПеременныхИПроцедур);
	ПараметрыДобавленияОбщихМодулей.Вставить("ТекстыСтроковыхФункцияДляСовместимости", ТекстыСтроковыхФункцияДляСовместимости);
	ПараметрыДобавленияОбщихМодулей.Вставить("ОписаниеРасширения", ОписаниеРасширения);
	ПараметрыДобавленияОбщихМодулей.Вставить("ЭтоГлавнаяОбработка", ЭтоГлавнаяОбработка);
	ПараметрыДобавленияОбщихМодулей.Вставить("ЭтоКлиентскийОбщийМодуль", ЭтоКлиентскийОбщийМодуль);
	
	ПараметрыПлагинов = Новый Соответствие;
	ПараметрыПлагинов[ПлагинДобавлениеВызововОбщихМодулей] = ПараметрыДобавленияОбщихМодулей;
	Результаты = Парсер.Пуск(Исходник, Плагины, ПараметрыПлагинов);
	
	Замены = Парсер.ТаблицаЗамен();
	НовыйИсходник = Парсер.ВыполнитьЗамены();
	Если Замены.Количество() > 0 Тогда
		ЗаписатьМодуль(НовыйИсходник, ИмяФайлаМодуля);
		
		ЗаменитьПеременныеВМодуле(ИмяФайлаМодуля, СтруктураПереименованийПеременныхМодулей, ЭтоМодульФормы);
		
	КонецЕсли;
	
КонецПроцедуры



#КонецОбласти

#Область СборкаГлавнойОбработки
Процедура ДополнитьГенерируемымКодомМодульФормыГлавнойОбработки()
	ИмяФайлаМодуля = ОбъединитьПути(
	ОбъединитьПути(СтруктураПортативныхИнструментов.ГлавнаяОбработка.Каталог, "Forms", "Форма"),
	"Ext",
	"Form",
	"Module.bsl");
	
	Если НЕ ФС.ФайлСуществует(ИмяФайлаМодуля) Тогда
		Возврат;
	КонецЕсли;
	
	Исходник = ТекстМодуля(ИмяФайлаМодуля);
	Парсер = Новый ПарсерВстроенногоЯзыка;
	ПлагинУстановкаТекстаПроцедурыПолученияОписанияПодключенныхМодулейПортативнойПоставки = Новый УстановкаТекстаПроцедурыПолученияОписанияПодключенныхМодулейПортативнойПоставки;
	
	Плагины = Новый Массив();
	Плагины.Добавить(ПлагинУстановкаТекстаПроцедурыПолученияОписанияПодключенныхМодулейПортативнойПоставки);
	
	ПараметрыПлагинУстановкаТекстаПроцедурыПолученияОписанияПодключенныхМодулейПортативнойПоставки = Новый Структура;
	ПараметрыПлагинУстановкаТекстаПроцедурыПолученияОписанияПодключенныхМодулейПортативнойПоставки.Вставить("СтруктураПортативныхИнструментов", СтруктураПортативныхИнструментов);
	ПараметрыПлагинУстановкаТекстаПроцедурыПолученияОписанияПодключенныхМодулейПортативнойПоставки.Вставить("ПрефиксПеременныхИПроцедур", ПрефиксПеременныхИПроцедур);
	
	ПараметрыПлагинов = Новый Соответствие;
	ПараметрыПлагинов[ПлагинУстановкаТекстаПроцедурыПолученияОписанияПодключенныхМодулейПортативнойПоставки] = ПараметрыПлагинУстановкаТекстаПроцедурыПолученияОписанияПодключенныхМодулейПортативнойПоставки;
	Результаты = Парсер.Пуск(Исходник, Плагины, ПараметрыПлагинов);
	
	Замены = Парсер.ТаблицаЗамен();
	НовыйИсходник = Парсер.ВыполнитьЗамены();
	Если Замены.Количество() > 0 Тогда
		ЗаписатьМодуль(НовыйИсходник, ИмяФайлаМодуля);
	КонецЕсли;
	
	СконвертироватьМодуль(ИмяФайлаМодуля, Истина, Истина);
	
КонецПроцедуры

Процедура ДобавитьПодчиненныйОбъектВГлавнуюОбработку(КаталогПодчиненныхОбъектовОбработки, ПодчиненныеОбъектыОбработки, ОписаниеПодчиненногоОбъекта, ИмяТэга, ИмяТэгаИзначального)
	
	ОписаниеШаблона = Новый Соответствие;
	ОписаниеШаблона.Вставить(ИмяТэга, ОписаниеПодчиненногоОбъекта.Имя);
	Если ТипЗнч(ПодчиненныеОбъектыОбработки._Элементы) <> Тип("Массив") Тогда
		ЭлементПодчиненныйОбъект = ПодчиненныеОбъектыОбработки._Элементы;
		ПодчиненныеОбъектыОбработки._Элементы = Новый Массив;
		ПодчиненныеОбъектыОбработки._Элементы.Добавить(ЭлементПодчиненныйОбъект);
		
	КонецЕсли;
	ПодчиненныеОбъектыОбработки._Элементы.Добавить(ОписаниеШаблона);
	
	ИмяФайлаОписанияШаблона = ОбъединитьПути(КаталогПодчиненныхОбъектовОбработки, ОписаниеПодчиненногоОбъекта.Имя + ".xml");
	//Копируем папки и файлы
	КопироватьФайл(ОписаниеПодчиненногоОбъекта.ФайлОписания, ИмяФайлаОписанияШаблона);
	
	ОписаниеШаблона = ПроцессорXML.ПрочитатьИзФайла(ИмяФайлаОписанияШаблона);
	КореньОписания = ОписаниеШаблона["MetaDataObject"];
	НастройкиШаблона = КореньОписания._Элементы[ИмяТэгаИзначального];
	КореньОписания._Элементы.Удалить(ИмяТэгаИзначального);
	КореньОписания._Элементы.Вставить(ИмяТэга, НастройкиШаблона);
	Если ИмяТэга = "Form" Тогда
		Свойства = НастройкиШаблона._Элементы["Properties"];
		Свойства.Удалить("UseStandardCommands");
		// Свойства.Удалить("IncludeHelpInContents");
		// Свойства.Удалить("ExtendedPresentation");
		Свойства.Удалить("Explanation");
	КонецЕсли;
	ПроцессорXML.ЗаписатьВФайл(ОписаниеШаблона, ИмяФайлаОписанияШаблона, Истина);
	
	ФС.КопироватьСодержимоеКаталога(ОписаниеПодчиненногоОбъекта.Каталог, ОбъединитьПути(КаталогПодчиненныхОбъектовОбработки, ОписаниеПодчиненногоОбъекта.Имя));
	
КонецПроцедуры

Процедура ДобавитьВГлавнуюОбработкуОбщиеМакеты(УзелОбработки)
	ПодчиненныеОбъектыОбработки = УзелОбработки._Элементы["ChildObjects"];
	
	Если ОписаниеРасширения.ОбщиеШаблоны.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	КаталогШаблоновОбработки = ОбъединитьПути(СтруктураПортативныхИнструментов.ГлавнаяОбработка.Каталог, "Templates");
	ФС.ОбеспечитьКаталог(КаталогШаблоновОбработки);
	Для Каждого Макет Из ОписаниеРасширения.ОбщиеШаблоны Цикл
		ДобавитьПодчиненныйОбъектВГлавнуюОбработку(КаталогШаблоновОбработки, ПодчиненныеОбъектыОбработки, Макет, "Template", "CommonTemplate");
		СтруктураПортативныхИнструментов.ГлавнаяОбработка.Макеты.Добавить(Макет.Имя);
	КонецЦикла;
КонецПроцедуры

Процедура ДобавитьМакетМодуляВГлавнуюОбработку(КаталогШаблоновОбработки, ПодчиненныеОбъектыОбработки, ОписаниеМодуля, ПрефиксИмени)
	Если НЕ ОписаниеМодуля.УспешноСобран Тогда
		Возврат;
	КонецЕсли;
	ИмяМодуля = ПрефиксИмени + ОписаниеМодуля.Имя;
	ИмяТэга = "Template";
	
	ОписаниеШаблона = Новый Соответствие;
	ОписаниеШаблона.Вставить(ИмяТэга, ИмяМодуля);
	Если ТипЗнч(ПодчиненныеОбъектыОбработки._Элементы) <> Тип("Массив") Тогда
		ЭлементПодчиненныйОбъект = ПодчиненныеОбъектыОбработки._Элементы;
		ПодчиненныеОбъектыОбработки._Элементы = Новый Массив;
		ПодчиненныеОбъектыОбработки._Элементы.Добавить(ЭлементПодчиненныйОбъект);
		
	КонецЕсли;
	ПодчиненныеОбъектыОбработки._Элементы.Добавить(ОписаниеШаблона);
	
	ИмяФайлаОписанияШаблона = ОбъединитьПути(КаталогШаблоновОбработки, ИмяМодуля + ".xml");
	//Копируем папки и файлы
	КопироватьФайл(ОбъединитьПути(КаталогШаблонаМакетаДвоичныхДанных, "ПустойМакет.xml"), ИмяФайлаОписанияШаблона);
	
	ОписаниеШаблона = ПроцессорXML.ПрочитатьИзФайла(ИмяФайлаОписанияШаблона);
	КореньОписания = ОписаниеШаблона["MetaDataObject"];
	НастройкиШаблона = КореньОписания._Элементы[ИмяТэга];
	НастройкиШаблона._Атрибуты.Вставить("uuid", Строка(Новый УникальныйИдентификатор));
	
	СвойстваШаблона = НастройкиШаблона._Элементы["Properties"];
	СвойстваШаблона.Вставить("Name", ИмяМодуля);
	
	ПроцессорXML.ЗаписатьВФайл(ОписаниеШаблона, ИмяФайлаОписанияШаблона, Истина);
	
	ФС.КопироватьСодержимоеКаталога(ОбъединитьПути(КаталогШаблонаМакетаДвоичныхДанных, "ПустойМакет"), ОбъединитьПути(КаталогШаблоновОбработки, ИмяМодуля));
	
	КопироватьФайл(ОписаниеМодуля.ФайлРезультатаСборки, ОбъединитьПути(КаталогШаблоновОбработки, ИмяМодуля, "Ext", "Template.bin"));
	
КонецПроцедуры

Процедура ДобавитьВГлавнуюОбработкуМакетыМодулей(УзелОбработки)
	ПодчиненныеОбъектыОбработки = УзелОбработки._Элементы["ChildObjects"];
	
	
	КаталогШаблоновОбработки = ОбъединитьПути(СтруктураПортативныхИнструментов.ГлавнаяОбработка.Каталог, "Templates");
	ФС.ОбеспечитьКаталог(КаталогШаблоновОбработки);
	Для Каждого ОписаниеМодуля Из СтруктураПортативныхИнструментов.ОбщиеМодули Цикл
		ДобавитьМакетМодуляВГлавнуюОбработку(КаталогШаблоновОбработки, ПодчиненныеОбъектыОбработки, ОписаниеМодуля.Значение, "ОбщийМодуль_");
	КонецЦикла;
	
	Для Каждого ОписаниеМодуля Из СтруктураПортативныхИнструментов.Инструменты Цикл
		ДобавитьМакетМодуляВГлавнуюОбработку(КаталогШаблоновОбработки, ПодчиненныеОбъектыОбработки, ОписаниеМодуля.Значение, "Инструмент_");
	КонецЦикла;
КонецПроцедуры

Процедура ДобавитьВГлавнуюОбработкуОбщиеФормы(УзелОбработки)
	ПодчиненныеОбъектыОбработки = УзелОбработки._Элементы["ChildObjects"];
	
	Если ОписаниеРасширения.ОбщиеФормы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	КаталогПодчиненныхОбъектовОбработки = ОбъединитьПути(СтруктураПортативныхИнструментов.ГлавнаяОбработка.Каталог, "Forms");
	ФС.ОбеспечитьКаталог(КаталогПодчиненныхОбъектовОбработки);
	Для Каждого Макет Из ОписаниеРасширения.ОбщиеФормы Цикл
		ДобавитьПодчиненныйОбъектВГлавнуюОбработку(КаталогПодчиненныхОбъектовОбработки, ПодчиненныеОбъектыОбработки, Макет, "Form", "CommonForm");
		СтруктураПортативныхИнструментов.ГлавнаяОбработка.Формы.Добавить(Макет.Имя);
		
		ПреобразоватьОписаниеОбщейФормы(КаталогПодчиненныхОбъектовОбработки, Макет.Имя);
	КонецЦикла;
КонецПроцедуры

Процедура ДобавитьВГлавнуюОбработкуМакетКартинок(УзелОбработки)
	ПодчиненныеОбъектыОбработки = УзелОбработки._Элементы["ChildObjects"];
	
	Если СтруктураПортативныхИнструментов.Картинки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ИмяФайлаАрхиваКартинок = МенеджерВременныхФайлов.НовоеИмяФайла("zip");
	
	ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяФайлаАрхиваКартинок);
	
	Для Каждого ОписаниеКартинки Из СтруктураПортативныхИнструментов.Картинки Цикл
		ЗаписьZipФайла.Добавить(ОписаниеКартинки.Значение.ИмяФайла, РежимСохраненияПутейZIP.НеСохранятьПути);
	КонецЦикла;
	ЗаписьZipФайла.Записать();
	
	ИмяМодуля = "УИ_Портативный_ОбщиеКартинки";
	ИмяТэга = "Template";
	КаталогШаблоновОбработки = ОбъединитьПути(СтруктураПортативныхИнструментов.ГлавнаяОбработка.Каталог, "Templates");
	
	ОписаниеШаблона = Новый Соответствие;
	ОписаниеШаблона.Вставить(ИмяТэга, ИмяМодуля);
	Если ТипЗнч(ПодчиненныеОбъектыОбработки._Элементы) <> Тип("Массив") Тогда
		ЭлементПодчиненныйОбъект = ПодчиненныеОбъектыОбработки._Элементы;
		ПодчиненныеОбъектыОбработки._Элементы = Новый Массив;
		ПодчиненныеОбъектыОбработки._Элементы.Добавить(ЭлементПодчиненныйОбъект);
		
	КонецЕсли;
	ПодчиненныеОбъектыОбработки._Элементы.Добавить(ОписаниеШаблона);
	
	ИмяФайлаОписанияШаблона = ОбъединитьПути(КаталогШаблоновОбработки, ИмяМодуля + ".xml");
	//Копируем папки и файлы
	КопироватьФайл(ОбъединитьПути(КаталогШаблонаМакетаДвоичныхДанных, "ПустойМакет.xml"), ИмяФайлаОписанияШаблона);
	
	ОписаниеШаблона = ПроцессорXML.ПрочитатьИзФайла(ИмяФайлаОписанияШаблона);
	КореньОписания = ОписаниеШаблона["MetaDataObject"];
	НастройкиШаблона = КореньОписания._Элементы[ИмяТэга];
	НастройкиШаблона._Атрибуты.Вставить("uuid", Строка(Новый УникальныйИдентификатор));
	
	СвойстваШаблона = НастройкиШаблона._Элементы["Properties"];
	СвойстваШаблона.Вставить("Name", ИмяМодуля);
	
	ПроцессорXML.ЗаписатьВФайл(ОписаниеШаблона, ИмяФайлаОписанияШаблона, Истина);
	
	ФС.КопироватьСодержимоеКаталога(ОбъединитьПути(КаталогШаблонаМакетаДвоичныхДанных, "ПустойМакет"), ОбъединитьПути(КаталогШаблоновОбработки, ИмяМодуля));
	
	КопироватьФайл(ИмяФайлаАрхиваКартинок, ОбъединитьПути(КаталогШаблоновОбработки, ИмяМодуля, "Ext", "Template.bin"));
	
КонецПроцедуры

Процедура СобратьГлавнуюОбработку(КаталогПортативнойСборки)
	ОписаниеОбработки = СтруктураПортативныхИнструментов.ГлавнаяОбработка.ОписаниеXML;
	УзелОбработки = ОписаниеОбработки._Элементы["MetaDataObject"]._Элементы["ExternalDataProcessor"];
	
	// Добавим узел контейнера, если его нет
	InternalInfo = УзелОбработки._Элементы["InternalInfo"];
	ContainedObject = InternalInfo._Элементы["xr:ContainedObject"];
	Если ContainedObject = Неопределено Тогда
		ContainedObject = Новый Структура;
		ContainedObject.Вставить("_Атрибуты", Новый Соответствие);
		ContainedObject.Вставить("_Элементы", Новый Соответствие);
		
		// 	<xr:ContainedObject>
		// 	<xr:ClassId>c3831ec8-d8d5-4f93-8a22-f9bfae07327f</xr:ClassId>
		// 	<xr:ObjectId>61951b99-ac3b-4417-965c-62f29d729dd9</xr:ObjectId>
		// </xr:ContainedObject>
		ContainedObject._Элементы.Вставить("xr:ClassId", "c3831ec8-d8d5-4f93-8a22-f9bfae07327f");
		ContainedObject._Элементы.Вставить("xr:ObjectId", Строка(Новый УникальныйИдентификатор));
		
		InternalInfo._Элементы.Вставить("xr:ContainedObject", ContainedObject);
	КонецЕсли;
	
	Properties = УзелОбработки._Элементы["Properties"];
	Properties._Элементы["Comment"]._Значение = СтруктураПортативныхИнструментов.Версия;
	
	ДобавитьВГлавнуюОбработкуОбщиеМакеты(УзелОбработки);
	ДобавитьВГлавнуюОбработкуОбщиеФормы(УзелОбработки);
	ДобавитьВГлавнуюОбработкуМакетКартинок(УзелОбработки);
	ДобавитьВГлавнуюОбработкуМакетыМодулей(УзелОбработки);
	
	ДобавитьВГлавнуюОбработкуМодульПрограммногоИнтерфейса(УзелОбработки);
	
	ПроцессорXMLБезУпрощения.ЗаписатьВФайл(ОписаниеОбработки, СтруктураПортативныхИнструментов.ГлавнаяОбработка.ФайлОписания, Истина);
	
	ДополнитьГенерируемымКодомМодульФормыГлавнойОбработки();
	
	Для Каждого ТекФорма Из ОписаниеРасширения.ОбщиеФормы Цикл
		ИмяФайлаФормы = ОбъединитьПути(
		ОбъединитьПути(СтруктураПортативныхИнструментов.ГлавнаяОбработка.Каталог, "Forms", ТекФорма.Имя),
		"Ext",
		"Form",
		"Module.bsl");
		
		СконвертироватьМодуль(ИмяФайлаФормы, Истина);
	КонецЦикла;
	
	ИмяМодуляПрограммногоИнтерфейса = "УИ_";
	ИмяФайлаФормы = ОбъединитьПути(
	ОбъединитьПути(СтруктураПортативныхИнструментов.ГлавнаяОбработка.Каталог, "Forms", ИмяМодуляПрограммногоИнтерфейса),
	"Ext",
	"Form",
	"Module.bsl");
	
	СконвертироватьМодуль(ИмяФайлаФормы, Истина);
	
	ИмяФайлаМодуляГлавнойОбработки = ОбъединитьПути(СтруктураПортативныхИнструментов.ГлавнаяОбработка.Каталог, "Ext", "ObjectModule.bsl");
	СконвертироватьМодуль(ИмяФайлаМодуляГлавнойОбработки, Ложь, Истина);
	
КонецПроцедуры

Процедура ДобавитьВГлавнуюОбработкуМодульПрограммногоИнтерфейса(УзелОбработки)
	ПодчиненныеОбъектыОбработки = УзелОбработки._Элементы["ChildObjects"];
	
	ОписаниеМодуля = Неопределено;
	
	Для Каждого ТекМодуль Из ОписаниеРасширения.ОбщиеМодули Цикл
		Если НРег(ТекМодуль.Имя) = "уи_" Тогда
			ОписаниеМодуля = ТекМодуль;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Если ОписаниеМодуля = Неопределено Тогда
		Сообщить("Не удалось добавить модуль программного интерфейса к главной обработке");
		Возврат;
	КонецЕсли;
	
	КаталогПодчиненныхОбъектовОбработки = ОбъединитьПути(СтруктураПортативныхИнструментов.ГлавнаяОбработка.Каталог, "Forms");
	ФС.ОбеспечитьКаталог(КаталогПодчиненныхОбъектовОбработки);
	
	НоваяФорма = Новый Соответствие();
	НоваяФорма.Вставить("Form", ОписаниеМодуля.Имя);
	ПодчиненныеОбъектыОбработки._Элементы.Добавить(НоваяФорма);
	
	//2. Добавить пустую форму в обработку
	ИмяФайлаОписанияФормы = ОбъединитьПути(КаталогПодчиненныхОбъектовОбработки, ОписаниеМодуля.Имя + ".xml");
	КопироватьФайл(ОбъединитьПути(КаталогШаблонаФормы, "ПустаяФорма.xml"), ИмяФайлаОписанияФормы);
	
	ОписаниеНовойФормы = ПроцессорXML.ПрочитатьИзФайла(ИмяФайлаОписанияФормы);
	СвойстваФормы = ОписаниеНовойФормы["MetaDataObject"]._Элементы["Form"]._Элементы["Properties"];
	СвойстваФормы["Name"] = ОписаниеМодуля.Имя;
	ОписаниеНовойФормы["MetaDataObject"]._Элементы["Form"]._Атрибуты["uuid"] = Строка(Новый УникальныйИдентификатор());
	ПроцессорXML.ЗаписатьВФайл(ОписаниеНовойФормы, ИмяФайлаОписанияФормы, Истина);
	
	КаталогФормы = ОбъединитьПути(КаталогПодчиненныхОбъектовОбработки, ОписаниеМодуля.Имя);
	ФС.ОбеспечитьКаталог(КаталогФормы);
	ФС.КопироватьСодержимоеКаталога(ОбъединитьПути(КаталогШаблонаФормы, "ПустаяФорма"), КаталогФормы);
	
	ИзменитьТипРеквизитаФормыШаблонаМодуляНаНовый(ОбъединитьПути(КаталогФормы, "Ext", "Form.xml"), ИмяГлавнойОбработки);
	
	//3. В добавленной форме установить модуль
	ИмяФайлаМодуляФормы = ОбъединитьПути(КаталогФормы, "Ext", "Form", "Module.bsl");
	
	ИсходникМодуля = ТекстМодуля(ОбъединитьПути(ОписаниеМодуля.Каталог, "Ext", "Module.bsl"));
	
	ТекстовыйДокумент = Новый ТекстовыйДокумент();
	ТекстовыйДокумент.УстановитьТекст(ДобавитьДирективуМетодовМодуля(ИсходникМодуля, "&НаКлиенте"));
	ТекстовыйДокумент.Записать(ИмяФайлаМодуляФормы);
	
	
	ИмяМодуляГлавнойОбработки = ОбъединитьПути(СтруктураПортативныхИнструментов.ГлавнаяОбработка.Каталог, "Ext", "ObjectModule.bsl");
	
	ИсходникМодуляГлавнойОбработки = ТекстМодуля(ИмяМодуляГлавнойОбработки);
	ИсходникМодуляГлавнойОбработки = ИсходникМодуляГлавнойОбработки + Символы.ПС+ Символы.ПС+ИсходникМодуля;
	ЗаписатьМодуль(ИсходникМодуляГлавнойОбработки, ИмяМодуляГлавнойОбработки);
	
	СтруктураПортативныхИнструментов.ГлавнаяОбработка.Формы.Добавить(ОписаниеМодуля.Имя);
	
КонецПроцедуры

#КонецОбласти

#Область СборкаБинарныхФайловПроекта

Функция КонфигураторИнициализированный()
	Конфигуратор = Новый УправлениеКонфигуратором;
	Если ЗначениеЗаполнено(ИмяКаталогаПлатформы) Тогда
		Конфигуратор.ПутьКПлатформе1С(ОбъединитьПути(ИмяКаталогаПлатформы, "1cv8" + ?(ОбщиеМетоды.ЭтоWindows(), ".exe", "")));
	КонецЕсли;
	КаталогБазы = МенеджерВременныхФайлов.СоздатьКаталог();
	Конфигуратор.СоздатьФайловуюБазу(КаталогБазы);
	Конфигуратор.УстановитьКонтекст("/F""" + КаталогБазы + """", "", "");
	
	
	
	Возврат Конфигуратор;
КонецФункции

Процедура СобратьБинарныйФайлГлавнойОбработки(КаталогПортативнойСборки)
	Конфигуратор = КонфигураторИнициализированный();
	СформироватьБинарныйФайл(Конфигуратор,
	СтруктураПортативныхИнструментов.ГлавнаяОбработка.ФайлОписания,
	ОбъединитьПути(КаталогПортативнойСборки, ВариантСборки.ИмяФайла + ".epf"));
КонецПроцедуры

Процедура СобратьБинарныеФайлыМодулей(КаталогПортативнойСборки)
	КаталогОбработокСборки = МенеджерВременныхФайлов.СоздатьКаталог();
	КаталогОбщихМодулейСборки = МенеджерВременныхФайлов.СоздатьКаталог();
	
	Конфигуратор = КонфигураторИнициализированный();
	
	Для Каждого ТекИнструмент Из СтруктураПортативныхИнструментов.Инструменты Цикл
		ОписаниеИнстурмента = ТекИнструмент.Значение;
		ОписаниеИнстурмента.ФайлРезультатаСборки = ОбъединитьПути(КаталогОбработокСборки, ОписаниеИнстурмента.Имя + ?(ОписаниеИнстурмента.ЭтоОтчет, ".erf", ".epf"));
		Попытка
			СформироватьБинарныйФайл(Конфигуратор,
			ОписаниеИнстурмента.ФайлОписания,
			ОписаниеИнстурмента.ФайлРезультатаСборки);
			ОписаниеИнстурмента.УспешноСобран = Истина;
		Исключение
			Сообщить("Не удалось собрать инструмент " + ОписаниеИнстурмента.Имя);
		КонецПопытки;
	КонецЦикла;
	Для Каждого ТекИнструмент Из СтруктураПортативныхИнструментов.ОбщиеМодули Цикл
		ОписаниеИнстурмента = ТекИнструмент.Значение;
		ОписаниеИнстурмента.ФайлРезультатаСборки = ОбъединитьПути(КаталогОбщихМодулейСборки, ОписаниеИнстурмента.Имя + ".epf");
		
		СформироватьБинарныйФайл(Конфигуратор,
		ОписаниеИнстурмента.ФайлОписания,
		ОписаниеИнстурмента.ФайлРезультатаСборки);
		
		ОписаниеИнстурмента.УспешноСобран = Истина;
	КонецЦикла;
	
	
КонецПроцедуры

Процедура СформироватьБинарныйФайл(Конфигуратор, ИмяИсходногоФайлаОбработки, ИмяФайлаОбработки)
	
	ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска();
	ПараметрыЗапуска.Добавить("/LoadExternalDataProcessorOrReportFromFiles """ + ИмяИсходногоФайлаОбработки + """  """ + ИмяФайлаОбработки + """");
	
	ИмяФайлаOut = МенеджерВременныхФайлов.СоздатьФайл("txt");
	ПараметрыЗапуска.Добавить("/Out """ + ИмяФайлаOut + """");
	
	Попытка
		Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска);
		// ТД = Новый ТекстовыйДокумент();
		// ТД.Прочитать(ИмяФайлаOut);
		// Лог.Информация(ТД.ПолучитьТекст());
	Исключение
		Лог.Ошибка("Ошибка сборки обработки " + ИмяИсходногоФайлаОбработки);
		Лог.Ошибка(ОписаниеОшибки());
		Лог.Ошибка(Конфигуратор.ВыводКоманды());
		ТД = Новый ТекстовыйДокумент();
		ТД.Прочитать(ИмяФайлаOut);
		Лог.Ошибка(ТД.ПолучитьТекст());
		ВызватьИсключение "Выгрузка обработок в xml прервана.";
	КонецПопытки;
КонецПроцедуры


#КонецОбласти

#Область КонвертацияОбщихМодулей
Процедура СконвертироватьОбщийМодуль(ТекИнструмент)
	НовоеИмяМодуля = ТекИнструмент.Имя;
	
	ОписаниеОбработки = ТекИнструмент.ОписаниеXML;
	УзелОбработки = ОписаниеОбработки._Элементы["MetaDataObject"]._Элементы["ExternalDataProcessor"];
	
	// Добавим узел контейнера, если его нет
	InternalInfo = УзелОбработки._Элементы["InternalInfo"];
	GeneratedType = InternalInfo._Элементы["xr:GeneratedType"];
	GeneratedType._Атрибуты["name"] = СтрЗаменить(GeneratedType._Атрибуты["name"], "ШаблонОбработки", НовоеИмяМодуля);
	
	Properties = УзелОбработки._Элементы["Properties"];
	Properties._Элементы["Name"] = НовоеИмяМодуля;
	Properties._Элементы["DefaultForm"]._Значение = СтрЗаменить(Properties._Элементы["DefaultForm"]._Значение, "ШаблонОбработки", НовоеИмяМодуля);
	
	
	ПроцессорXMLБезУпрощения.ЗаписатьВФайл(ОписаниеОбработки, ТекИнструмент.ФайлОписания, Истина);
	
	// Исправляем форму обработки
	Для Каждого ИмяФормы Из ТекИнструмент.Формы Цикл
		ФайлОписанияФормы = ОбъединитьПути(ОбъединитьПути(ТекИнструмент.Каталог, "Forms", ИмяФормы), "Ext", "Form.xml");
		
		ИзменитьТипРеквизитаФормыШаблонаМодуляНаНовый(ФайлОписанияФормы, НовоеИмяМодуля);
	КонецЦикла;
КонецПроцедуры

Процедура ИзменитьТипРеквизитаФормыШаблонаМодуляНаНовый(ФайлОписанияФормы, НовоеИмяМодуля)
	ОписаниеФормы = ПроцессорXMLБезУпрощения.ПрочитатьИзФайла(ФайлОписанияФормы);
	УзелРеквизитов = ОписаниеФормы._Элементы["Form"]._Элементы["Attributes"];
	РеквизитОбъект = УзелРеквизитов._Элементы["Attribute"];
	ТипРеквизита = РеквизитОбъект._Элементы["Type"];
	ТипРеквизита._Элементы["v8:Type"]._Значение = СтрЗаменить(ТипРеквизита._Элементы["v8:Type"]._Значение, "ШаблонОбработки", НовоеИмяМодуля);
	
	ПроцессорXMLБезУпрощения.ЗаписатьВФайл(ОписаниеФормы, ФайлОписанияФормы, Истина);
КонецПроцедуры

#КонецОбласти


Лог = Новый Лог("app.build.tools_ui_1c");
ПроцессорXML = Новый СериализаторXML();
ПроцессорXMLБезУпрощения = Новый СериализаторXML(Ложь);
ИмяГлавнойОбработки = "УИ_ПортативныеУниверсальныеИнструменты";
МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов();